#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define ll long long
const int maxn = 100005;
struct Node{
int l,r;
ll pre,add;
}node[maxn*4];
void build(int p,int l,int r){
node[p].l = l;
node[p].r = r;
node[p].pre = -1;
node[p].add = -1;
if(l==r)
return ;
int mid = (l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void spread(int p){
if(node[p].add!=-1){
node[p*2].pre = node[p].add;
node[p*2+1].pre = node[p].add;
node[p*2].add = node[p].add;
node[p*2+1].add = node[p].add;
node[p].add = -1;
}
}
void change(int p,int l,int r,int v)
{
if(l<=node[p].l&&node[p].r<=r){
node[p].pre = v;
node[p].add = v;
return ;
}
spread(p);
int mid = (node[p].l+node[p].r)>>1;
if(l<=mid)change(p*2,l,r,v);
if(r>mid)change(p*2+1,l,r,v);
}
void query(int p,int l,int r){
if(l<=node[p].l&&node[p].r<=r){
printf("%d\n",node[p].pre);
return ;
}
spread(p);
int mid = (node[p].l+node[p].r)>>1;
if(l<=mid)query(p*2,l,r);
if(r>mid)query(p*2+1,l,r);
}
bool book[maxn];
vector<int> v[maxn];
int pos[maxn],num[maxn];
int cnt = 1;
void dfs(int now,int fa){
pos[now] = cnt++;
num[now] = 1;
for(int i=0;i<v[now].size();i++){
if(v[now][i]!=fa){
dfs(v[now][i],now);
num[now]+=num[v[now][i]];
}
}
}
int n,m;
int main()
{
int T, cas = 1;
scanf("%d", &T);
while (T--) {
cnt = 1;
memset(book, false, sizeof(book));
printf("Case #%d:\n", cas++);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
v[i].clear();
m = n - 1;
int a,b;
while (m--) {
scanf("%d%d", &a, &b);
v[b].push_back(a);
book[a] = true;
}
for (int i = 1; i <= n; i++) {
if (book[i] == false) {
dfs(i, 0);//对根节点深搜
break;
}
}
build(1,1,n);
scanf("%d", &m);
while(m--) {
char op[3];
int l,r,k;
scanf("%s",&op);
if(op[0]=='C') {
scanf("%d",&k);
query(1,pos[k],pos[k]);
} else {
scanf("%d %d",&l,&r);
change(1,pos[l],pos[l]+num[l]-1,r);
}
}
}
return 0;
}