rt,提交记录
#include <bits/stdc++.h>
#pragma GCC optmize(2)
#define debug puts("done")
using namespace std;
#define int long long
int n,m,u,v,W;
int lg[300005]={-1},d[300005],f[300005][30],s[300005],ans,sum[300005];
vector<int> e[300005],w[300005];
struct Node{
int u,v,x;
}t[300005];
void dfs(int u,int fa){
d[u]=d[fa]+1;
f[u][0]=fa;
for(int i=1;i<=lg[d[u]];i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=0;i<e[u].size();i++)
if(e[u][i]!=fa){
sum[e[u][i]]+=sum[u]+w[u][i];
dfs(e[u][i],u);
}
return;
}
int LCA(int x,int y){
while(d[x]>d[y]) x=f[x][lg[d[x]-d[y]]];
// cout<<x<<" "<<y<<endl;
if(x==y) return x;
for(int i=lg[d[x]];i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
void dfs2(int u,int fa){
for(int i=0;i<e[u].size();i++)
if(e[u][i]!=fa){
dfs2(e[u][i],u);
s[u]+=s[e[u][i]];
}
// cout<<u<<" "<<s[u]<<endl;
return;
}
bool cmp(Node a,Node b){
return a.x>b.x;
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++){
cin>>u>>v>>W;
e[u].push_back(v);
e[v].push_back(u);
w[u].push_back(W);
w[v].push_back(W);
}
for(int i=1;i<=n;i++)
lg[i]=lg[i>>1]+1;
dfs(1,0);
for(int i=1;i<=m;i++){
cin>>t[i].u>>t[i].v;
u=t[i].u,v=t[i].v;
// cout<<d[u]<<" "<<d[v]<<endl<<endl;;
// cout<<endl;
if(d[u]<d[v]) swap(u,v);
int p=LCA(u,v);
// s[p]-=2;
// s[u]++,s[v]++;
t[i].x=sum[u]+sum[v]-2*sum[p];
// cout<<t[m].x<<endl;
// cout<<endl;
}
// dfs2(1,0);
sort(t+1,t+m+1,cmp);
ans=t[1].x;
for(int i=1;i<=n;i++)
for(int j=0;j<e[i].size();j++){
int res=0;
for(int k=1;k<=m;k++){
if(res>=t[k].x||res>=ans) break;
// cout<<k<<" "<<t[k].x<<" "<<t[k].u<<" "<<t[k].v<<" "<<e[i][j]<<endl;
int o=LCA(t[k].u,t[k].v),p=LCA(t[k].u,e[i][j]),q=LCA(t[k].v,e[i][j]);
// cout<<o<<" "<<p<<" "<<q<<endl;
if(((o==p)&&(e[i][j]==q))||((o==q)&&(e[i][j]==p))) res=max(res,t[k].x-w[i][j]);
else{
res=max(res,t[k].x);
break;
}
}
ans=min(ans,res);
}
cout<<ans;
return 0;
}