rt,WA 掉了
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return f*x;
}
int t,n,u,v,w,dep[10005],lg[10005],sum[10005],f[10005][15],lc;
struct edge{
int v,w;
};
vector<edge> g[10005];
void dfs(int x,int fa){
f[x][0]=fa,dep[x]=dep[fa]+1;
for(int i=1;i<=lg[dep[x]];i++)
f[x][i]=f[f[x][i-1]][i-1];
for(int i=0;i<g[x].size();i++)
if(g[x][i].v^fa)
sum[g[x][i].v]=sum[x]+g[x][i].w,dfs(g[x][i].v,x);
}
inline int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
while(dep[u]<dep[v]) u=f[u][lg[dep[u]-dep[v]]];
if(u==v) return u;
for(int i=lg[dep[u]];~i;i--)
if(f[u][i]^f[v][i])
u=f[u][i],v=f[v][i];
return f[u][0];
}
string s;
inline int query(int x,int y){
for(int i=0;i<=lg[y];i++)
if(y&(1<<i))
x=f[x][i];
return x;
}
signed main(){
t=read();
for(int i=1;i<=10000;i++)
lg[i]=lg[i-1]+(i==(1<<lg[i-1]+1));
while(t--){
n=read();
for(int i=1;i<n;i++)
u=read(),v=read(),w=read(),g[u].push_back((edge){v,w}),g[v].push_back((edge){u,w});
dfs(1,0);
while(cin>>s){
if(s=="DONE") break;
if(s=="DIST")
u=read(),v=read(),lc=lca(u,v),printf("%lld\n",sum[u]+sum[v]-(sum[lc]<<1));
else{
u=read(),v=read(),w=read(),lc=lca(u,v);
if(dep[u]-dep[lc]+1>=w) printf("%lld\n",query(u,w-1));
else printf("%lld\n",query(v,dep[u]+dep[v]-(dep[lc]<<1)-w+1));
}
}
for(int i=1;i<=n;i++) g[i].clear();
memset(dep,0,sizeof dep),memset(f,0,sizeof f),memset(sum,0,sizeof sum);
}
return 0;
}