#include<bits/stdc++.h>
using namespace std;
int n,m;
struct G{
int to;
int val;
G(int to=0,int val=0):to(to),val(val){}
};
vector<G> h[300005];
int From[300005],To[300005];
int lg[300005];
int sum[300005],D[300005],A[300005][20],edge[300005];
void dfs(int u,int fa){
A[u][0]=fa;
for(int i=1;i<20;i++){
A[u][i]=A[A[u][i-1]][i-1];
}
for(G T:h[u]){
if(T.to==fa) continue;
edge[T.to]=T.val;
sum[T.to]=sum[u]+T.val;
D[T.to]=D[u]+1;
dfs(T.to,u);
}
}
int LCA(int u,int v){
if(D[u]<D[v]) swap(u,v);
while(D[u]>D[v]){
u=A[u][lg[D[u]-D[v]]];
}
if(u==v) return u;
for(int i=19;i>=0;i--){
if(A[u][i]!=A[v][i]){
u=A[u][i];
v=A[v][i];
}
}
return A[u][0];
}
int path[300005];
int diff[300005];
void modify(int p,int d){
diff[p]+=d;
diff[1]-=d;
}
int ans[300005];
void dfsANS(int u,int fa){
for(G T:h[u]){
if(T.to==fa) continue;
dfsANS(T.to,u);
ans[u]+=ans[T.to];
}
ans[u]+=diff[u];
}
bool chk(int x){
memset(diff,0,sizeof(diff));
memset(ans,0,sizeof(ans));
int cnt=0,sub=0;
for(int i=1;i<=m;i++){
if(path[i]>x){
modify(From[i],1);
modify(To[i],1);
modify(LCA(From[i],To[i]),-2);
cnt++;
sub=max(sub,path[i]-x);
}
}
dfsANS(1,0);
for(int i=2;i<=n;i++){
if(ans[i]==cnt){
if(edge[i]>=sub){
return true;
}
}
}
return false;
}
int main(){
//freopen("dfd.in","r",stdin);
//freopen("dfd.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
lg[i]=lg[i-1]+((1<<lg[i-1])==i);
}
for(int i=1;i<=n;i++){
lg[i]--;
}
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
h[u].push_back(G(v,w));
h[v].push_back(G(u,w));
}
for(int i=1;i<=m;i++){
cin>>From[i]>>To[i];
}
D[1]=1;
dfs(1,0);
int r=1e9;
for(int i=1;i<=m;i++){
path[i]=sum[From[i]]+sum[To[i]]-2*sum[LCA(From[i],To[i])];
r=min(r,path[i]);
}
int l=0,mid,ans;
while(l<=r){
mid=l+r>>1;
if(chk(mid)){
ans=mid;
r=mid-1;
} else{
l=mid+1;
}
}
cout<<ans;
return 0;
}
实在调不动了,求调(悬赏大号小号各一个关注)!