using namespace std;
const int N=40010;
const int M=20;
int s;
struct node
{
int v,w;
node() {}
node(int vv,int ww)
{
v=vv;
w=ww;
}
};
vector<node> q[N];
int fa[N][M];
int dis[N][M];
int dep[N];
int n,m;
void dfs(int u)
{
for(int i=1; i<=s; i++)
{
fa[u][i]=fa[fa[u][i-1]][i-1];
dis[u][i]=dis[u][i-1]+dis[fa[u][i-1]][i-1];
if(!fa[u][i]) break;
}
for(int i=0; i<q[u].size(); i++)
{
int v=q[u][i].v,w=q[u][i].w;
if(v!=fa[u][0])
{
dep[v]=dep[u]+1;
fa[v][0]=u;
dis[v][0]=w;
dfs(v);
}
}
}
void init()
{
s=floor(log(n+0.0)/log(2.0));
//最多能跳的2^i祖先
dep[0]=-1;
for(int i=1; i<=n; i++)q[i].clear();
}
int LCA(int a,int b)
{
if(dep[a]>dep[b])swap(a, b);
int ans=0;
for(int i=s; i>=0; i--)
if(dep[a]<dep[b]&&dep[fa[b][i]]>=dep[a])
ans+=dis[b][i],b=fa[b][i];
for(int i=s; i>=0; i--)
if(fa[a][i]!=fa[b][i])//a,b的2^i祖先不一样=>没跳到同样深度位置,接着跳
ans+=dis[a][i],ans+=dis[b][i],a=fa[a][i],b=fa[b][i];//一起往上跳
if(a!=b)ans+=dis[a][0],ans+=dis[b][0];
//没跳到一个地方,那么再往上一个结点就是它们的LCA
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1; i<n; i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
q[u].push_back(node(v,w));
q[v].push_back(node(u,w));
}
dfs(1);
for(int i=0; i<m; i++)
{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",LCA(u,v));
}
}
}