/*hdu3974Assign the task
并查集
建立集合:v u表示v是u的下属
T x y 当x被分配到y任务时,他和下属的任务立刻变更为y
C x 询问x当前所分配的任务
task[i]表示i最后直接接到分配的任务 num[i]表示i接到任务的序号
当询问x时 只要找到祖先中最迟分配到的任务,即num[i]最大相对应的task[i]
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=50001;
int pre[maxn],vis[maxn],task[maxn];
int find(int x)
{
int ans=task[x],t=vis[x];
int r=x;
while(pre[r]!=r)
{
int pa=pre[r];
if(t<vis[pa])
{
ans=task[pa];
t=vis[pa];
}
r=pre[r];
}
return ans;
}
int main()
{
int cas,Cas=0;
cin>>cas;
while(cas--)
{
int n,v,u;
cin>>n;
memset(vis,0,sizeof(vis));
memset(task,-1,sizeof(task));
for(int i=1;i<=n;i++)pre[i]=i;
for(int i=1;i<n;i++)
{
cin>>v>>u;
pre[v]=u;
}
int num=0;
int m,x,y;
cin>>m;
char ch;
cout<<"Case #"<<++Cas<<":"<<endl;
for(int i=0;i<m;i++)
{
cin>>ch;
if(ch=='T')
{
cin>>x>>y;
task[x]=y;
vis[x]=++num;
}
else
{
cin>>x;
cout<<find(x)<<endl;
}
}
}
}