#include <bits/stdc++.h>
#define MAXN 500500
using namespace std;
int n,m,s[MAXN],t[MAXN],sum[MAXN];
struct edge{
int v,w;
};
vector <edge> G[MAXN];
void add(int u,int v,int w)
{
G[u].push_back((edge){v,w});
G[v].push_back((edge){u,w});
}
void dfs(int u,int fa,int t)
{
int length=0,max_len=0;
if(u==t)
{
cout << length-max_len << endl;
return;
}
for(int i=0;i<=G[u].size();i++)
{
int to=G[u][i].v;
if(to==fa)
continue;
dfs(to,u,t);
length+=G[u][i].w;
max_len=max(max_len,G[u][i].w);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for(int i=1;i<=n-1;i++)
{
int u,v,w;
cin >> u >> v >> w;
sum[v]=sum[u]+w;
add(u,v,w);
}
for(int i=1;i<=m;i++)
cin >> s[i] >> t[i];
if(m==1)
dfs(s[1],0,t[1]);
else
{
int answer=0;
for(int i=1;i<=n-1;i++)
{
int res=0,wor=G[i][i+1].w;
G[i][i+1].w=0;
for(int j=1;j<=m;j++)
{
int tot=abs(sum[t[j]]-sum[s[j]]);
if(i<=t[i] && i>=s[j])
tot-=wor;
res=max(res,tot);
}
G[i][i+1].w=wor;
answer=min(answer,res);
}
cout << answer << endl;
}
return 0;
}