#include<bits/stdc++.h>
#define MAXN 300005
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
struct Node{int v,w;};
struct Edge
{
int u,v,lca,s;
bool operator <(const Edge &a)const{return s>a.s;}
}e[MAXN];
vector<Node>g[MAXN];
int deep[MAXN],p[MAXN][25],dis[MAXN],n,m,maxE,maxx,sum[MAXN];
inline void dfs(int u,int fa)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].v;
if(v==fa) continue;
deep[v]=deep[u]+1;
p[v][0]=u;
dis[v]=dis[u]+g[u][i].w;
dfs(v,u);
}
}
void init()
{
dfs(1,0);
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
p[i][j]=p[p[i][j-1]][j-1];
}
inline int lca(int u,int v)
{
if(deep[u]>deep[v]) swap(u,v);
for(int i=20;i>=0;i--)
if(deep[p[v][i]]>=deep[u]) v=p[v][i];
if(u==v) return u;
for(int i=20;i>=0;i--)
if(p[u][i]!=p[v][i])
{
u=p[u][i];
v=p[v][i];
}
return p[u][0];
}
inline void getsum(int u,int fa,int tot)
{
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].v;
if(v==fa) continue;
getsum(v,u,tot);
sum[u]+=sum[v];
if(sum[v]==tot) maxx=max(maxx,g[u][i].w);
}
}
inline bool check(int mid)
{
if(e[1].s-mid>maxE) return 1;
if(mid>=e[1].s) return 0;
memset(sum,0,sizeof(sum));
int tot=0;
for(int i=1;i<=m;i++)
{
if(e[i].s<=mid) break;
sum[e[i].u]+=1;
sum[e[i].v]+=1;
sum[e[i].lca]-=2;
tot++;
}
maxx=0;
getsum(1,0,tot);
if(maxx>=e[1].s-mid) return 0;
return 1;
}
int main()
{
n=read(),m=read();
for(int i=1,u,v,w;i<=n-1;i++)
{
u=read(),v=read(),w=read();
g[u].push_back((Node){v,w});
g[v].push_back((Node){u,w});
maxE=max(maxE,w);
}
init();
for(int i=1,u,v;i<=m;i++)
{
u=read(),v=read();
int t=lca(u,v);
e[i]=(Edge){u,v,t,dis[u]+dis[v]-2*dis[t]};
}
sort(e+1,e+m+1);
int l=0,r=e[1].s,ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))l=mid+1;
else
{
ans=mid;
r=mid-1;
}
}
printf("%d",ans);
}