#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5;
int n,m,a,b,c,L,R;
int d[MAXN+5],u[MAXN+5],v[MAXN+5],len[MAXN+5],la[MAXN+5],
lst[MAXN+5],depth[MAXN+5],fval[MAXN+5],father[MAXN+5][25];
struct edge
{
int to;
int nxt;
int val;
}e[2*MAXN+5];
int cnt,head[MAXN+5];
void add(int u,int v,int w)
{
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
e[cnt].val=w;
head[u]=cnt;
}
void dfs(int x,int f)
{
d[x]=d[f]+1;
father[x][0]=f;
for (int i=1;i<25;i++)
{
father[x][i]=father[father[x][i-1]][i-1];
}
for (int i=head[x];i!=0;i=e[i].nxt)
{
if (e[i].to!=f)
{
depth[e[i].to]=depth[x]+e[i].val;
fval[e[i].to]=e[i].val;
dfs(e[i].to,x);
}
}
}
int lca(int x,int y)
{
if (depth[x]<depth[y])
{
swap(x,y);
}
for (int i=24;i>=0;i--)
{
if (depth[father[x][i]]>=depth[y])
{
x=father[x][i];
}
}
if (x==y)
{
return x;
}
for (int i=24;i>=0;i--)
{
if (father[x][i]!=father[y][i])
{
x=father[x][i];
y=father[y][i];
}
}
return father[x][0];
}
void dfs2(int x,int f)
{
for (int i=head[x];i!=0;i=e[i].nxt)
{
if (e[i].to!=f)
{
dfs2(e[i].to,x);
lst[x]+=lst[e[i].to];
}
}
}
bool check(int k)
{
int t=0,maxn=0;
memset(lst,0,sizeof(lst));
for (int i=1;i<=m;i++)
{
if (len[i]>k)
{
t++;
lst[u[i]]++;
lst[v[i]]++;
lst[la[i]]-=2;
}
}
dfs2(1,0);
for (int i=1;i<=n;i++)
{
if (lst[i]==t)
{
maxn=max(maxn,fval[i]);
}
}
for (int i=1;i<=m;i++)
{
if (len[i]-maxn>k)
{
return 0;
}
}
return 1;
}
int find(int L,int R)
{
int l=L,r=R,mid,ans;
while (l<=r)
{
mid=(l+r)/2;
if (check(mid))
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for (int i=1;i<=n-1;i++)
{
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
L=max(L,c);
}
dfs(1,0);
for (int i=1;i<=m;i++)
{
cin>>u[i]>>v[i];
la[i]=lca(u[i],v[i]);
len[i]=depth[u[i]]+depth[v[i]]-2*depth[la[i]];
R=max(R,len[i]);
}
cout<<find(R-L,R);
return 0;
}