1 / 1
Jul 2017
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

#define sd(x) scanf("%d", &x);
#define slld(x) scanf("%lld", &x);
#define pd(x) printf("%d\n", x);
#define plld(x) printf("%lld\n", x);

#define vi vector<int>
#define vll vector<ll>
#define pii pair<int, int>
#define pllll pair<ll, ll>
#define f first
#define s second
#define REP(i, a) for(int i=0; i<a; ++i)
#define REPB(i, a, b) for(int i=a; i<b; ++i)
#define FILL(a, x) memset(a, x, sizeof(a))
#define CLEAR(x) memset(x, 0, sizeof(x))
#define mp make_pair
#define pb push_back

const int mod = 1e9+7;
const ll INF = 1e18;

int P[10007];
int L[10007];
int PI[10007][50];
int AM[10007][10007];

void bfs(vector<vi> Adj, int s, vi& visited)	{
	visited[s]=1;
	P[s]=-1;
	L[s]=0;
	queue<int> q;
	q.push(s);
	
	while(!q.empty())	{
		int A=q.front();
		q.pop();
		REP(i, Adj[A].size())	{
			if(!visited[Adj[A][i]])	{	
				visited[Adj[A][i]]=1;
				P[Adj[A][i]]=A;
				L[Adj[A][i]]=L[A]+1;
				q.push(Adj[A][i]);
			}
		}
	}

}

int lca(int p, int q)	{
	if(L[p] < L[q])	
		swap(p, q);
	int log;
	if(L[p] == 1)
		log=0;
	else
		log=ceil(log2(L[p]))-1;
	for(int i=log; i>=0; i--)	{
		if((L[p]-L[q]) >= pow(2, i))	
			p=PI[p][i];
	}
	if(p==q)
		return p;
	for(int i=log; i>=0; i--)	{
		if(PI[p][i] != -1 && (PI[p][i] != PI[q][i]))	{
			p=PI[p][i];
			q=PI[q][i];
		}
	}
	return P[p];
}

int main()	{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int t;
	sd(t);
	while(t)	{
		t--;
		int n;
		sd(n);
		vector<vi> Adj(n);
		REP(i, n-1)	{	
			int a, b, c;
			sd(a);
			sd(b);
			sd(c);
			Adj[a-1].pb(b-1);
			Adj[b-1].pb(a-1);
			AM[a-1][b-1]=c;
			AM[b-1][a-1]=c;
		}
		vi visited(n);	
		bfs(Adj, 0, visited);	

		memset(PI, -1, sizeof(PI));

		REP(i, n)	{
			PI[i][0]=P[i];
		}	

		for(int j=0; pow(2, j) < n; j++)	{
			REP(i, n)	{
				if(PI[i][j-1]!=-1)
					PI[i][j]=PI[PI[i][j-1]][j-1];
				
			}
		}
		char in[10];	
		while(true)	{
			int a,b,k;
			cin>>in;
			if(in[1] == 'I')	{
				cin >> a >> b;
				a--;
				b--;
				int d=lca(a, b);
				ll res=0;
				while(a!=d)	{
					res+=AM[a][P[a]];
					a=P[a];
				}
				while(b!=d)	{
					res+=AM[b][P[b]];
					b=P[b];
				}
				printf("%lld\n",res);
			}
			else	{
				if(in[1] == 'T')	{
					cin >> a >> b >> k;
					a--;
					b--;
					int d=lca(a,b);
					int te=L[a]+L[b]-2*L[d]+1;
					if(k <= L[a]-L[d]+1)	{
						int z=1;
						while(z<k)	{
							a=P[a];
							z++;
						}
						printf("%d\n",a+1);	
					}			
					else	{
						int z=1;
						while(z<te-k+1)	{
							b=P[b];	
							z++;
						}		
						printf("%d\n",b+1);				
					}	
					
				}		
				else	{
					printf("\n");
					break;
				}
			}
		}		
	}
	return 0;
}