#include<bits/stdc++.h>
#define M 300050
#define N 300050
using namespace std;
int n,m;
int a,b,t;
int ver[2*M],edge[2*M],head[N],Next[2*M],tot;
int p[N][21],dep[N],len[N];
int l,r;
int ans;
int d[N];
int pre[N];
struct node {
int u,v,LCA,dis;
}s[M];
bool cmp(node x,node y) {
return x.dis>y.dis;
}
void add(int u,int v,int w) {
edge[++tot]=w;
ver[tot]=v;
Next[tot]=head[u];
head[u]=tot;
}
void dfs(int u,int fa) {
p[u][0]=fa;
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=Next[i]) {
int v=ver[i];
if(v==fa) continue;
pre[v]=edge[i];
len[v]=len[u]+pre[v];
dfs(v,u);
}
}
int lca(int x,int y) {
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(dep[x]-(1<<i)>=dep[y]) x=p[x][i];
if(x==y) return x;
for(int i=20;i>=0;i--)
if(p[x][i]!=p[y][i]) {
x=p[x][i];
y=p[y][i];
}
return p[x][0];
}
void dfs1(int u,int fa) {
for(int i=head[u];i;i=Next[i]) {
int v=ver[i];
if(v==fa) continue;
dfs(v,u);
d[u]+=d[v];
}
}
bool check(int x) {
int cnt=0,maxn=0;
memset(d,0,sizeof(d));
for(int i=1;i<=m;i++) {
if(s[i].dis>x) {
d[s[i].u]++;
d[s[i].v]++;
d[s[i].LCA]-=2;
cnt++;
}
}
dfs1(1,0);
for(int i=1;i<=n;i++)
if(d[i]==cnt) maxn=max(maxn,pre[i]);
return s[1].dis-maxn<=x;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++) {
cin>>a>>b>>t;
add(a,b,t);
add(b,a,t);
}
dfs(1,0);
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++) p[i][j]=p[p[i][j-1]][j-1];
for(int i=1;i<=m;i++) {
cin>>s[i].u>>s[i].v;
s[i].LCA=lca(s[i].u,s[i].v);
s[i].dis=len[s[i].u]+len[s[i].v]-2*len[s[i].LCA];
r=max(r,s[i].dis);
}
sort(s+1,s+m+1,cmp);
while(l<=r) {
int mid=l+r>>1;
if(check(mid)) {
r=mid-1;
ans=mid;
}
else l=mid+1;
}
cout<<ans;
return 0;
}