#include<bits/stdc++.h>
using namespace std;
const int maxn=300010;
int last[maxn],dep[maxn],fa[maxn],siz[maxn],top[maxn];
int son[maxn],sum[maxn],dfn[maxn],W[maxn],c[maxn];
int n,m,cnt,tot;
struct Edge
{
int to,nxt,val;
}a[maxn<<1];
struct data
{
int s,t,d;
}t[maxn];
bool cmp(data a,data b)
{
return a.d>b.d;
}
inline void Add(int x,int y,int val)
{
a[++cnt].to=y;
a[cnt].val=val;
a[cnt].nxt=last[x];
last[x]=cnt;
}
void dfs1(int x,int f)
{
dfn[++tot]=x;
dep[x]=dep[f]+1;
fa[x]=f;
siz[x]=1;
int maxson=-1;
for(int i=last[x];i;i=a[i].nxt)
{
int y=a[i].to;
if(y==f) continue;
sum[y]=sum[x]+a[i].val;
W[y]=a[i].val;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>maxson)
maxson=siz[y],son[x]=y;
}
}
void dfs2(int x,int topf)
{
top[x]=topf;
if(!son[x]) return;
dfs2(son[x],topf);
for(int i=last[x];i;i=a[i].nxt)
{
int y=a[i].to;
if(y==fa[x] || y==son[x])
continue;
dfs2(y,y);
}
}
int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y]) return x;
return y;
}
bool check(int mid)
{
int cnt=0;
if(t[1].d<=mid) return true;
for(int i=1;i<=m;i++)
{
if(t[i].d<=mid) break;
cnt++;
}
memset(c,0,sizeof(c));
for(int i=1;i<=cnt;i++)
c[t[i].s]++,c[t[i].t]++,c[LCA(t[i].s,t[i].t)]-=2;
for(int i=n;i>=2;i--)
c[fa[dfn[i]]]+=c[dfn[i]];
for(int i=2;i<=n;i++)
if(c[i]==cnt)
if(t[1].d-W[i]<=mid) return true;
return false;
}
int main()
{
int u,v,w,l=0,r=0;
scanf("%d %d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d %d %d",&u,&v,&w);
Add(u,v,w),Add(v,u,w);
r+=w;
}
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&t[i].s,&t[i].t);
t[i].d=sum[t[i].s]+sum[t[i].t]-(sum[LCA(t[i].s,t[i].t)]<<1);
}
sort(t+1,t+m+1,cmp);
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)) r=mid-1;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}