#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <set>#include <vector>using namespace std;const int N=100009;int n,m;int a,b,c,x,y;int len[N];int get[N];int vis[N],fa[N];vector<pair<int,int> > v[N],need[N];void dfs(int x,int f,int L)//處理出每個點到根的距離{ vis[x]=1; len[x]=L; for(int i=0;i<v[x].size();i++) { int y=v[x][i].first; if(y==f)continue; dfs(y,x,L+v[x][i].second); fa[y]=x; }}void dfs2(int x,int f,int id)//vis[x]=id表示節點x對應環上的點id{ vis[x]=id; for(int i=0;i<v[x].size();i++) { int y=v[x][i].first; if(y==f)continue; dfs2(y,x,id); }}void init(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { v[i].clear(); fa[i]=i; vis[i]=0; } for(int i=1;i<=n-1;i++) { scanf("%d%d%d",&a,&b,&c); v[a].push_back(make_pair(b,c)); v[b].push_back(make_pair(a,c)); } scanf("%d%d%d",&a,&b,&c); dfs(b,-1,0);//以b為根建樹 fa[b]=-1; if(c>=len[a])//如果加入的邊比原先b-a的距離大,答案全為零 { for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); puts("0"); } } else { int x=a; int id=3; do //由a遍曆到b,將非環上的點對應成環上的點 { vis[x]=2; for(int i=0;i<v[x].size();i++) { int y=v[x][i].first; if(y==fa[x]||vis[y]==2)continue; dfs2(y,x,id); } get[id]=x;//get[id]=x表示vis[y]=id的點都對應點x id++; x=fa[x]; }while(x!=-1); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); if(vis[x]!=2) x=get[vis[x]];//如果不是環上的點,找到對應點 if(vis[y]!=2) y=get[vis[y]]; if(len[y]<len[x]) swap(x,y); int tmp1=len[y]-len[x]; int tmp2=len[x]+c+len[a]-len[y];//比較繞新加入的邊是否可以減少距離 if(tmp2<tmp1) { printf("%d\n",tmp1-tmp2); } else { puts("0"); } } }}int main(){ int T; scanf("%d",&T); for(int ii=1;ii<=T;ii++) { printf("Case #%d:\n",ii); init(); }return 0;}