#include<bits/stdc++.h>
#define int long long
const int N=300005;
using namespace std;
int ma,mb,mm;
struct tr{
int ma,l,r;
}t[N<<3];
struct qj{
int x,y;
}str[N];
bool cmp(qj i,qj j){
return i.x<j.x;
}
int num;
int head[N],en;
int st[N][31],dep[N],len[N][31],size[N],son[N],fa[N],seg[N],rev[N],tot,top[N],ans;
struct Edge{
int next,to,val;
}edge[N*2];
void add(int u,int v,int w){
edge[++en].val=w;
edge[en].to=v;
edge[en].next=head[u];
head[u]=en;
}
int n,m;
void build(int f,int u,int w){
st[u][0]=f;
len[u][0]=w;
dep[u]=dep[f]+1;
for(int i=1;i<=30;i++){
if(!st[st[u][i-1]][i-1])
break;
st[u][i]=st[st[u][i-1]][i-1];
if(st[u][i])len[u][i]=len[u][i-1]+len[st[u][i-1]][i-1];
}
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(f==v)continue;
build(u,v,edge[i].val);
}
}
int lca(int x,int y,int &w){
w=0;
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)
if(st[x][i]&&dep[st[x][i]]>=dep[y]){
w+=len[x][i];
x=st[x][i];
}
if(x==y)return x;
for(int i=20;i>=0;i--)
if(st[x][i]!=0&&st[x][i]!=st[y][i]){
w+=len[x][i]+len[y][i];
x=st[x][i];
y=st[y][i];
}
w+=len[x][0]+len[y][0];
return st[x][0];
}
int dfs1(int u){
size[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa[u])continue;
fa[v]=u;
size[u]+=dfs1(v);
if(size[v]>size[son[u]])son[u]=v;
}
return size[u];
}
void dfs2(int u){
if(son[u]){
seg[son[u]]=++tot;
rev[tot]=son[u];
top[son[u]]=top[u];
dfs2(son[u]);
}
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa[u]||v==son[u])continue;
seg[v]=++tot;
rev[tot]=v;
top[v]=v;
dfs2(v);
}
}
void cl(int x,int y,int l){
int fx=top[x],fy=top[y];
num=0;
while(fx!=fy){
if(dep[fx]<dep[fy]){
swap(fx,fy);
swap(x,y);
}
if(fx!=l)str[++num].x=seg[fx];
else str[++num].x=seg[fx]+1;
str[num].y=seg[x];
x=fa[top[x]];
fx=top[x];
}
if(x==y)return;
if(dep[x]<dep[y])swap(x,y);
if(seg[x]<seg[y]+1)return;
str[++num].x=seg[y]+1;
str[num].y=seg[x];
}
void buil(int k){
if(t[k].l==t[k].r)return;
int mid=(t[k].l+t[k].r)>>1;
t[k<<1].l=t[k].l;t[k<<1].r=mid;
t[k<<1|1].l=mid+1;t[k<<1|1].r=t[k].r;
buil(k<<1);buil(k<<1|1);
}
void pushdown(int k){
t[k<<1].ma=max(t[k<<1].ma,t[k].ma);
t[k<<1|1].ma=max(t[k<<1|1].ma,t[k].ma);
t[k].ma=0;
}
void cm(int k,int l,int r,int ad){
if(l>r)return;
if(t[k].l>=l&&t[k].r<=r){
t[k].ma=max(t[k].ma,ad);
return;
}
pushdown(k);
int mid=(t[k].l+t[k].r)>>1;
if(mid>=l)cm(k<<1,l,r,ad);
if(mid+1<r)cm(k<<1|1,l,r,ad);
return;
}
int query(int k,int x){
if(t[k].l==t[k].r)
return t[k].ma;
pushdown(k);
if(t[k<<1].r>=x)return query(k<<1,x);
return query(k<<1|1,x);
}
void findans(int x,int y){
ans=99999999999999;
if(dep[x]<dep[y])swap(x,y);
while(dep[x]>dep[y]){
ans=min(max(query(1,seg[x]),mm-len[x][0]),ans);
x=fa[x];
}
while(x!=y){
ans=min(max(query(1,seg[x]),mm-len[x][0]),ans);
x=fa[x];
ans=min(max(query(1,seg[y]),mm-len[y][0]),ans);
y=fa[y];
}
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<n;i++){
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
build(0,1,0);
dfs1(1);
top[1]=1;
seg[1]=++tot;
rev[tot]=1;
dfs2(1);
t[1].l=1;
t[1].r=n;
buil(1);
str[0].y=1;
for(int i=1;i<=m;i++){
int u,v;
scanf("%lld%lld",&u,&v);
int w,l=lca(u,v,w);
if(w>mm){
mm=w;
ma=u;
mb=v;
}
cl(u,v,l);
// cout<<num<<endl;
sort(str+1,str+num+1,cmp);
str[++num].x=n+1;
for(int i=1;i<=num;i++)cm(1,str[i-1].y+1,str[i].x-1,w);
}
findans(ma,mb);
cout<<(ans==99999999999999?0:ans);
return 0;
}
测试数据