#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
int ans=0x3f3f3f3f;
int h[N],e[N*2],ne[N*2],w[N*2],idx;
int n,m;
int st[N];
int fs[N],dist[N];
int x[N],y[N];
int que[N];
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int get_sz(int u,int fa){
if(st[u])return 0;
int sz=1;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa)continue;
sz+=get_sz(j,u);
}
return sz;
}
int get_ws(int u,int fa,int tot,int &ws){
if(st[u])return 0;
int sum=1,ms=0;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa)continue;
int t=get_ws(j,u,tot,ws);
ms=max(ms,t);
sum+=t;
}
ms=max(ms,tot-sum);
if(ms<=tot/2)ws=u;
return sum;
}
void get_dist(int u,int f,int rt){
fs[u]=rt;
for(int i=h[u];~i;i=ne[i]){
if(e[i]==f)continue;
dist[e[i]]=dist[u]+w[i];
get_dist(e[i],u,rt);
}
}
void calc(int u){
if(st[u]){
cout<<ans<<'\n';
exit(0);
}
st[u]=1;
dist[u]=0;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
dist[j]=w[i];
get_dist(j,u,j);
}
int last=0,mlen=0,tt=0;
for(int i=1;i<=m;i++){
if(dist[x[i]]+dist[y[i]]>mlen){
tt=1;
que[tt]=i;
mlen=dist[x[i]]+dist[y[i]];
}
else if(dist[x[i]]+dist[y[i]]==mlen){
que[++tt]=i;
}
}
ans=min(ans,mlen);
for(int i=1;i<=tt;i++){
if(fs[x[que[i]]]!=fs[y[que[i]]]){
cout<<ans<<'\n';
exit(0);
}
if(!last)last=fs[x[que[i]]];
if(last!=fs[x[que[i]]]){
cout<<ans<<'\n';
exit(0);
}
}
get_ws(u,-1,get_sz(u,-1),u);
calc(u);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=1;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
for(int i=1;i<=m;i++){
cin>>x[i]>>y[i];
}
int rt=1;
get_ws(rt,-1,get_sz(rt,-1),rt);
calc(rt);
return 0;
}