#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const long long Max=3e5+1;
long long ans=0,hole=0;
long long n,m;
long long fa[20][Max],tot,Head[Max],Next[2*Max],ver[2*Max],edge[2*Max],cnt[Max],dep[Max],path[Max],sum1[Max];
long long LCA[Max];
pair<long long,long long> line[Max];
long long lca(long long x,long long y){
if(dep[x]<dep[y]){
swap(x,y);
}
long long c=dep[x]-dep[y];
for(long long i=19;i>=0;i--){
if(c&(1<<i)){
x=fa[i][x];
}
}
if(x==y){
return x;
}
for(long long i=19;i>=0;i--){
if(fa[i][x]!=fa[i][y]){
x=fa[i][x];
y=fa[i][y];
}
}
return fa[0][x];
}
void add(long long x,long long y,long long z){
ver[++tot]=y;edge[tot]=z;
Next[tot]=Head[x];Head[x]=tot;
}
void dfs1(long long x,long long f,long long d){
fa[0][x]=f;dep[x]=d;
for(long long i=1;i<=19;i++){
fa[i][x]=fa[i-1][fa[i-1][x]];
}
for(long long i=Head[x];i;i=Next[i]){
long long y=ver[i];
if(y==f){
continue;
}
sum1[y]=sum1[x]+edge[i];
dfs1(y,x,d+1);
}
}
bool flag=0;
long long me=0;
long long dfs2(long long x,long long f,long long z){
long long sum=0;
for(long long i=Head[x];i;i=Next[i]){
long long y=ver[i];
if(y==f){
continue;
}
long long z1=dfs2(y,x,z),w=edge[i];
if(z1==z){
flag=1;
me=max(me,w);
}
sum+=z1;
}
sum+=cnt[x];
return sum;
}
bool check(long long x){
long long mp=0;
flag=0;me=0;
long long num=0;
memset(cnt,0,sizeof(cnt));
for(long long i=1;i<=m;i++){
if(path[i]>x){
num++;
long long a=line[i].first,b=line[i].second;
cnt[a]++;cnt[b]++;cnt[LCA[i]]-=2;
mp=max(path[i],mp);
}
}
dfs2(1,0,num);
if(flag&&mp-me<=x){
return 1;
}
return 0;
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>m;
long long mp=0;
for(long long i=1;i<=n-1;i++){
long long x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dfs1(1,0,1);
for(long long i=1;i<=m;i++){
long long x,y;
cin>>x>>y;
line[i]=make_pair(x,y);
long long z=lca(x,y);LCA[i]=z;
path[i]=sum1[x]+sum1[y]-2*sum1[z];
mp=max(mp,path[i]);
}
long long l=0,r=mp;
while(l<r){
long long mid=(l+r)>>1;
if(check(mid)){
r=mid;
}else{
l=mid+1;
}
}
cout<<l;
}