RT
#include<bits/stdc++.h>
using namespace std;
int n,m,dep[500005],f[500005][25],lg[500005],u,v,w,l,r,mid,ans;
int dis[500005],sum[500005];
struct node {
int to,dis;
};
vector<node>ve[500005];
struct path {
int x,y,lca,dis;
} p[500005];
void dfs(int now,int fa) {
f[now][0]=fa;
dep[now]=dep[fa]+1;
for(int i=1; i<lg[dep[now]]; i++)
f[now][i]=f[f[now][i-1]][i-1];
for(int i=0; i<ve[now].size(); i++)
if(ve[now][i].to!=fa) {
dis[ve[now][i].to]=ve[now][i].dis+dis[now];
dfs(ve[now][i].to,now);
}
}
int LCA(int x,int y) {
if(dep[x]>dep[y])swap(x,y);
while(dep[y]>dep[x])y=f[y][lg[dep[y]-dep[x]]-1];
if(x==y)return x;
for(int i=lg[dep[x]]-1; i>=0; i--)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
void num(int now,int fa) {
for(int i=0; i<ve[now].size(); i++) {
int y=ve[now][i].to;
if(y==fa)continue;
num(y,now);
sum[now]+=sum[y];
}
}
bool check(int x) {
int cnt=0,res=0;
for(int i=1; i<=n; i++)sum[i]=0;
for(int i=1; i<=m; i++) {
if(p[i].dis>x) {
cnt++;
sum[p[i].x]++,sum[p[i].y]++,sum[p[i].lca]-=2;
res=max(res,p[i].dis-x);
}
}
if(!cnt)return true;
num(1,0);
for(int i=2; i<=n; i++)
if(sum[i]==cnt&&dis[i]-dis[f[i][0]]>=res)return true;
return false;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<n; i++) {
scanf("%d%d%d",&u,&v,&w);
ve[u].push_back((node) {
v,w
});
ve[v].push_back((node) {
u,w
});
}
dfs(1,0);
for(int i=1; i<=m; i++) {
scanf("%d%d",&p[i].x,&p[i].y);
p[i].lca=LCA(p[i].x,p[i].y);
p[i].dis=dis[p[i].x]+dis[p[i].y]-dis[p[i].lca]*2;
r=max(r,p[i].dis);
}
while(r>=l) {
mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
}