RT,调不动了
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,m,u,v,w,maxn,id,cnt,maxnn,dep[N],f[N][25],d[N],dis[N],l=-1,r;
struct edge{
int to;
int val;
};
vector<edge> nbr[N];
struct node{
int u;
int v;
int Lca;
int dist;
}a[N];
inline void dfs(int cur,int fa){
f[cur][0]=fa;
dep[cur]=dep[fa]+1;
for(int i=1;(1<<i)<=n;i++)
f[cur][i]=f[f[cur][i-1]][i-1];
for(int i=0;i<nbr[cur].size();i++){
int son=nbr[cur][i].to,w=nbr[cur][i].val;
if(son==fa) continue;
dis[son]=dis[cur]+w;
dfs(son,cur);
}
return;
}
inline int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=18;i>=0;i--)
if(dep[f[u][i]]>=dep[v])
u=f[u][i];
if(u==v) return u;
for(int i=18;i>=0;i--)
if(f[u][i]!=f[v][i]){
u=f[u][i];
v=f[v][i];
}
return f[u][0];
}
inline int get_dis(int x,int y){
return dis[x]+dis[y]-2*dis[lca(x,y)];
}
inline void dfs_tr(int cur){
for(int i=0;i<nbr[cur].size();i++){
int son=nbr[cur][i].to;
if(son==f[cur][0]) continue;
dfs_tr(son);
d[cur]+=d[son];
}
return;
}
inline void dfs_ans(int cur){
for(int i=0;i<nbr[cur].size();i++){
int son=nbr[cur][i].to,w=nbr[cur][i].val;
if(son==f[cur][0]) continue;
if(d[son]==cnt) maxnn=max(maxnn,w);
dfs_ans(son);
}
return;
}
inline bool check(int x){
memset(d,0,sizeof(d));
maxn=maxnn=-1;
for(int i=1;i<=m;i++)
if(maxn<a[i].dist){
maxn=a[i].dist;
id=i;
}
if(maxn<=x) return true;
cnt=0;
for(int i=1;i<=m;i++)
if(a[i].dist>x){
d[a[i].u]++;d[a[i].v]++;
d[a[i].Lca]-=2;
cnt++;
}
dfs_tr(1);dfs_ans(1);
return maxn-maxnn<=x;
}
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
n=read();m=read();
for(int i=1;i<n;i++){
u=read();v=read();w=read();
nbr[u].push_back((edge){v,w});
nbr[v].push_back((edge){u,w});
}
dfs(1,0);
for(int i=1;i<=m;i++){
a[i].u=read();a[i].v=read();
a[i].dist=get_dis(a[i].u,a[i].v);
r=max(r,a[i].dist);
a[i].Lca=lca(a[i].u,a[i].v);
}
r++;
while(l+1<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid;
}
printf("%d",r);
return 0;
}