代码:
#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
struct node{
int x,y;
node(int xx,int yy)
{
x=xx,y=yy;
}node(){}
};
int ans[40005];
vector<node> lin[40005];
vector<node> q[40005];
int dis[40005];
int fa[40005];
int vis[40005];
int n,m,aa,bb,cc;
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unio(int x,int y)
{
fa[find(y)]=find(x);
}
void init()
{
for(int i=1;i<=n;i++)
{
lin[i].clear();
q[i].clear();
fa[i]=i;
vis[i]=0;
ans[i]=0;
dis[i]=0;
}
}
void dfs(int x)
{
vis[x]=1;
for(int i=0;i<lin[x].size();i++)
{
int v=lin[x][i].x;
if(!vis[v])
{
dis[v]=dis[x]+lin[x][i].y;
dfs(v);
unio(x,v);
}
}
for(int i=0;i<q[x].size();i++)
{
int v=q[x][i].x;
if(vis[v]) ans[q[x][i].y]=dis[x]+dis[v]-2*dis[find(v)];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&aa,&bb,&cc);
lin[aa].push_back(node(bb,cc));
lin[bb].push_back(node(aa,cc));
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&aa,&bb);
q[aa].push_back(node(bb,i));
q[bb].push_back(node(aa,i));
}
dfs(1);
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
}