#include<bits/stdc++.h>
using namespace std;
int n,m,bs,he[300005],ne[600005],f[300005],s[300005],gs[300005],zr[300005],tf[300005],df[300005],l,r,mid,cc,l1[300005],ss,sss,q[300005];
struct node{int x,y,z;}a[300005],d[300005],g[600005];
void hi(int x,int y,int z)
{
f[x]=y,s[x]=z;int zd=0,w=0;
df[++cc]=x;
for(int i=he[x];i;i=ne[i])
{
if(g[i].x!=y)
{
l1[g[i].x]=l1[x]+g[i].y;
hi(g[i].x,x,z+1),gs[x]+=gs[g[i].x];
if(zd<gs[g[i].x])zd=gs[g[i].x],w=g[i].x;
}
}
zr[x]=w;
}
int lca(int x,int y)
{
while(tf[x]!=tf[y])
{
if(s[tf[x]]<s[tf[y]])swap(x,y);
x=f[tf[x]];
}
return s[x]<s[y]?x:y;
}
int check(int x)
{
int cnt=0,an=0;
memset(q,0,sizeof(q));
for(int i=1;i<=m;i++)
{
if(l1[d[i].x]+l1[d[i].y]-2*l1[d[i].z]>x)
{
q[d[i].x]++;
q[d[i].y]++;
q[d[i].z]-=2;
an=max(an,l1[d[i].x]+l1[d[i].y]-2*l1[d[i].z]-x);
cnt++;
}
else continue;
}
if(cnt==0)return 1;
for(int i=n;i>=1;i--)q[f[df[i]]]+=q[df[i]];
for(int i=2;i<=n;i++)if(q[i]==cnt&&l1[i]-l1[f[i]]>=an)return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
l1[1]=0;
for(int i=1;i<n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].z;
ne[++bs]=he[a[i].x];
he[a[i].x]=bs;
g[bs].x=a[i].y;
g[bs].y=a[i].z;
ne[++bs]=he[a[i].y];
he[a[i].y]=bs;
g[bs].x=a[i].x;
g[bs].y=a[i].z;
sss=max(sss,a[i].z);
}
hi(1,1,1);
tf[1]=1;
for(int i=2;i<=n;i++)
{
tf[df[i]]=df[i]==zr[f[df[i]]]?tf[f[df[i]]]:df[i];
}
for(int i=1;i<=m;i++)
{
cin>>d[i].x>>d[i].y;
d[i].z=lca(d[i].x,d[i].y);
ss=max(ss,l1[d[i].x]+l1[d[i].y]-2*l1[d[i].z]);
}
l=ss-sss,r=ss;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}