#include<bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int MAXN=3e5+10;
int n,m;
struct node{
int to,nxt,w;
}a[MAXN<<1];
int head[MAXN],tot;
void add(int x,int y,int w){
a[++tot].to=y;
a[tot].nxt=head[x];
a[tot].w=w;
head[x]=tot;
}
int fi[MAXN],se[MAXN],dp[MAXN][21],w[MAXN][21],dep[MAXN];
pii dis[MAXN];
void dfs(int now,int fa,int c){
dp[now][0]=fa,w[now][0]=c,dep[now]=dep[fa]+1;
for(register int i=1;i<=20;i++){
dp[now][i]=dp[dp[now][i-1]][i-1];
w[now][i]=w[now][i-1]+w[dp[now][i-1]][i-1];
}
for(register int i=head[now];i;i=a[i].nxt){
int to=a[i].to;
if(to==fa) continue;
dfs(to,now,a[i].w);
}
}
pii lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
long long ans=0;
for(register int i=20;i>=0;i--){
if(dep[dp[x][i]]>=dep[y]) ans+=w[x][i],x=dp[x][i];
}
if(x==y) return mp(x,ans);
for(register int i=20;i>=0;i--){
if(dp[x][i]!=dp[y][i]){
ans+=w[x][i]+w[y][i];
x=dp[x][i],y=dp[y][i];
}
}
return mp(dp[x][0],ans+w[x][0]+w[y][0]);
}
int d[MAXN],edge[MAXN],mx;
void to_dfn(int now,int fa){
for(register int i=head[now];i;i=a[i].nxt){
int to=a[i].to;
if(fa==to) continue;
to_dfn(to,now);
d[now]+=d[to];
edge[i]=d[to];
}
}
bool check(int x){
for(register int i=1;i<=n;i++) d[i]=edge[i]=0;
int cnt=0;
for(register int i=1;i<=m;i++){
if(dis[i].second>x){
d[fi[i]]++,d[se[i]]++;
d[dis[i].first]-=2,cnt++;
}
}
if(!cnt) return 1;
to_dfn(1,0);
int maxn=0;
for(register int i=1;i<=2*n;i++){
if(edge[i]==cnt) maxn=max(maxn,a[i].w);
}
return mx-maxn<=x;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>n>>m;
for(register int i=1;i<n;i++){
int u,v,c;cin>>u>>v>>c;
add(u,v,c),add(v,u,c);
}
dfs(1,0,0);
for(register int i=1;i<=m;i++){
cin>>fi[i]>>se[i];
dis[i]=lca(fi[i],se[i]);mx=max(mx,dis[i].second);
}
int l=0,r=3e8+10,num=3e8;
while(l<=r){
int mid=l+r>>1;
if(check(mid)) num=mid,r=mid-1;
else l=mid+1;
}
cout<<num;
return 0;
}