#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define MAXN 600008
using namespace std;
int n,m,head[MAXN],next[MAXN],vet[MAXN],len[MAXN],dis[MAXN],ance[MAXN];
int head1[MAXN],next1[MAXN],vet1[MAXN],hh[MAXN],ans[MAXN];
int color[MAXN],fa[MAXN],tot,tot1,l,r,res,ff[MAXN],tmp[MAXN];
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void add1(int x,int y){
tot1++;
hh[tot1]=x;
next1[tot1]=head1[x];
head1[x]=tot1;
vet1[tot1]=y;
}
void add(int x,int y,int z){
tot++;
next[tot]=head[x];
head[x]=tot;
vet[tot]=y;
len[tot]=z;
}
void tarjan(int u){
color[u]=1;
for(int i=head[u];i!=0;i=next[i]){
int y=vet[i];
if(!color[y]){
dis[y]=dis[u]+len[i];
tarjan(y);
fa[y]=u;
}
}
for(int i=head1[u];i!=0;i=next1[i]){
int y=vet1[i];
if(color[y]){
ance[(i+1)/2]=find(y);
ans[(i+1)/2]=dis[u]+dis[y]-2*dis[ance[(i+1)/2]];
r=max(ans[(i+1)/2],r);
}
}
}
void dfs(int u){
color[u]=1;
for(int i=head[u];i!=0;i=next[i]){
int y=vet[i];
if(!color[y]){
ff[y]=len[i];
dfs(y);
tmp[u]+=tmp[y];
}
}
}
bool check(int flag){
int ma=0,sum=0,g=0;
memset(color,0,sizeof(color));
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=m;i++){
if(ans[i]>flag){
tmp[hh[i*2]]++;
tmp[vet1[i*2]]++;
tmp[ance[i]]-=2;
ma=max(ans[i],ma);
sum++;
}
}
dfs(1);
for(int i=1;i<=n;i++){
if(tmp[i]==sum){
g=max(g,ff[i]);
}
}
return (ma-g)<=flag;
}
void init(){
tot=tot1=0; r=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add1(x,y);
add1(y,x);
}
}
void solve(){
tarjan(1);
l=0; res=r;
while(l<=r){
int mid=(l+r) >> 1;
if(check(mid)){
res=mid;
r=mid-1;
}else{
l=mid+1;
}
}
}
void print(){
printf("%d",res);
}
int main(){
init();
solve();
print();
}