HDU 2586
#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
vector<int>f[40010],flen[40010];
int n,m,dis[40010],dep[40010],fat[40010],p[40010][30];
void dfs(int x,int y,int z){
dep[x]=y;
dis[x]=z;
for(int i=0;i<f[x].size();i++)
if(dep[f[x][i]]==0){
fat[f[x][i]]=x;
dfs(f[x][i],y+1,z+flen[x][i]);
}
}
int search(int x,int y){
if(dep[x]<dep[y]){
int t=x;
x=y;
y=t;
}
int j,sum=0;
for(;(1<<sum)<=dep[x];sum++);
sum--;
for(j=sum;j>=0;j--)
if(dep[x]-(1<<j)>=dep[y])
x=p[x][j];
if(x==y)return x;
for(j=sum;j>=0;j--)
if(p[x][j]!=-1&&p[x][j]!=p[y][j]){
x=p[x][j];
y=p[y][j];
}
return fat[x];
}
int main(){
int x,y,z,i,j,t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
f[i].clear();
flen[i].clear();
}
memset(dep,0,sizeof(dep));
for(i=1;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
f[x].push_back(y);
flen[x].push_back(z);
f[y].push_back(x);
flen[y].push_back(z);
}
fat[1]=-1;
dis[1]=0;
dfs(1,1,0);
for(j=0;(1<<j)<=n;j++)
for(i=1;i<=n;i++)
p[i][j]=-1;
for(i=1;i<=n;i++)
p[i][0]=fat[i];
for(j=1;(1<<j)<=n;j++)
for(i=1;i<=n;i++)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1];
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",dis[x]+dis[y]-2*dis[search(x,y)]);
}
}
return 0;
}