#include<bits/stdc++.h>
using namespace std;
#define int long long
int p,n,m,head[300005],q[300005],line;
int lg[300005],la[300005],xx[300005],yy[300005],an,cnt,son[300005],fa[300005],dep[300005],siz[300005],top[300005],dis[300005],t[300005];
struct abc
{
int v,w,nt;
} e[600005];
inline int read()
{
char c=getchar();int x=0;bool f=0;
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
if(f)x=-x;return x;
}
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nt=head[u];
head[u]=cnt;
}
void dfs1(int x,int f,int deep,int dce)
{
dis[x]=dce;
dep[x]=deep;
fa[x]=f;
siz[x]=1;
int ms=-1;/*maxson*/
for(int i=head[x];i;i=e[i].nt)
{
if(e[i].v==f)
continue;
q[e[i].v]=e[i].w;
dfs1(e[i].v,x,deep+1,dce+e[i].w);
siz[x]+=siz[e[i].v];
if(siz[e[i].v]>ms)son[x]=e[i].v,ms=siz[e[i].v];
}
}
void dfs2(int x,int tf/*topfather*/)
{
top[x]=tf;
if(!son[x]) return;
dfs2(son[x],tf);
for(int i=head[x];i;i=e[i].nt)
{
if(e[i].v==fa[x]||e[i].v==son[x])continue;
dfs2(e[i].v,e[i].v);
}
}
inline int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
void dfp(int f,int x)
{
for(int i=head[x];i;i=e[i].nt)
{
if(e[i].v==f)
continue;
dfp(x,e[i].v);
t[x]+=t[e[i].v];
}
if(t[x]==p) an=max(an,q[x]);
}
bool check(int mid)
{
an=0,p=0;
memset(t,0,sizeof(t));
for(int i=1;i<=m;i++)
{
if(lg[i]>mid)
{
//t[fa[la[i]]]-=1;
t[la[i]]=-2;//应为+=-2
t[xx[i]]++;
t[yy[i]]++;
p++;
}
}
dfp(-1,1);
if(line-an<=mid)
return true;
return false;
}
signed main()
{
// freopen("o.in","r",stdin);
// freopen("o.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n-1;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z);
add(y,x,z);
}
dfs1(1,0,1,0);
dfs2(1,1);
for(int i=1;i<=m;i++)
{
xx[i]=read(),yy[i]=read();
la[i]=lca(xx[i],yy[i]);
lg[i]=(dis[xx[i]]+dis[yy[i]])-2*dis[la[i]];
line=max(line,lg[i]);
}
int l=0,r=0x3f3f3f3f3f,ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
}
这样的代码竟然有95分???