#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,l,r,head[N],cnt1,f[N][20],deep[N],dis[N][20],ans,cnt,val[N];
struct node{int to,nxt,w;}e[N];
void add(int u,int v,int w){
e[++cnt1].to=v;
e[cnt1].nxt=head[u];
e[cnt1].w=w;
head[u]=cnt1;
}
struct Node{int x,y,dis,lca;}q[N];
void dfs(int u,int fa){
f[u][0]=fa;
deep[u]=deep[fa]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa)continue;
dfs(v,u);
dis[v][0]=e[i].w;
}
}
int lca(int x,int y,int id){
if(deep[y]>deep[x])swap(x,y);
for(int i=19;i>=0;i--){
if(deep[f[x][i]]>=deep[y]){
q[id].dis+=dis[x][i];
x=f[x][i];
}
}
if(x==y)return x;
for(int i=19;i>=0;i--){
if(f[x][i]!=f[y][i]){
q[id].dis+=dis[x][i]+dis[y][i];
x=f[x][i],y=f[y][i];
}
}
q[id].dis+=dis[x][0]+dis[y][0];
return f[x][0];
}
bool cmp(Node x,Node y){
return x.dis>y.dis;
}
void addd(int s,int t){
val[t]++;
val[s]--;
}
void dfss(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa)continue;
dfss(v,u);
val[u]+=val[v];
}
}
bool check(int diss){
cnt=0;
memset(val,0,sizeof(val));
for(int i=1;i<=m;i++){
if(q[i].dis<=diss)break;
addd(q[i].lca,q[i].x),addd(q[i].lca,q[i].y);
cnt++;
}
dfss(1,0);
int maxn=0;
for(int i=1;i<=n;i++){
if(val[i]==cnt){
maxn=max(maxn,dis[i][0]);
}
}
return q[1].dis-maxn<=diss;
}
int main(){
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w),add(v,u,w);
l=max(l,w);
}
dfs(1,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=19;j++){
f[i][j]=f[f[i][j-1]][j-1];
dis[i][j]=dis[i][j-1]+dis[f[i][j-1]][j-1];
}
}
for(int i=1;i<=m;i++){
cin>>q[i].x>>q[i].y;
q[i].lca=lca(q[i].x,q[i].y,i);
r=max(r,q[i].dis);
}
l=r-l;
sort(q+1,q+1+m,cmp);
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
cout<<ans;
return 0;
}