#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 30010;
int sum[maxn<<2],add[maxn<<2],cnt[maxn][2],t,n;
map<string,int> id;
struct edge {
int from,to,v;
edge(int a=0,int b=0,int c=0):from(a),to(b),v(c){}
};
vector<edge> edges;
vector<int> G[maxn];
void init() {
edges.clear();
for (int i = 0; i < maxn; i++) G[i].clear();
memset(sum,0,sizeof(sum));
memset(add,0,sizeof(add));
for (int i = 1; i < maxn; i++) cnt[i][0] = INF, cnt[i][1] = 0;
}
void addedge(int from,int to,int v) {
edges.push_back(edge(from,to,v));
edges.push_back(edge(to,from,v));
int m = edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
void pushdown(int rt,int l1,int r1,int l2,int r2) {
if (add[rt]) {
sum[rt<<1] = r1-l1+1-sum[rt<<1];
sum[rt<<1|1] = r2-l2+1-sum[rt<<1|1];
add[rt<<1] ^= add[rt];
add[rt<<1|1] ^= add[rt];
add[rt] = 0;
}
}
void update(int l,int r,int L,int R,int c,int rt) {
if (l <= L && R <= r) {
sum[rt] = (R-L+1-sum[rt]);
add[rt] ^= c;
return;
}
int mid = (L+R)>>1;
pushdown(rt,L,mid,mid+1,R);
if (l <= mid) update(l,r,L,mid,c,rt<<1);
if (r > mid) update(l,r,mid+1,R,c,rt<<1|1);
sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}
void dfs(int u,int fa) {
for (int i = 0; i < G[u].size(); i++) {
edge e = edges[G[u][i]];
if (e.to == fa) continue;
dfs(e.to,u);
cnt[e.to][0] = min(cnt[e.to][0],e.to);
cnt[e.to][1] = max(cnt[e.to][1],e.to);
if (e.v == 1) update(cnt[e.to][0],cnt[e.to][1],1,n,e.v,1);
cnt[u][0] = min(cnt[e.to][0],cnt[u][0]);
cnt[u][1] = max(cnt[e.to][1],cnt[u][1]);
}
}
int main()
{
int kase = 0;
scanf ("%d",&t);
while(t--) {
scanf ("%d",&n);
string s;
init();
id.clear();
for (int i = 1; i <= n; i++) {
cin >> s;
id[s] = i;
}
string w;
int v;
for (int i = 1; i <= n-1; i++) {
cin >> s >> w >> v;
addedge(id[s],id[w],v);
}
dfs(1,-1);
int q;
scanf ("%d",&q);
printf ("Case #%d:\n",++kase);
while(q--) {
cin >> s;
if (s[0] == 'Q') {
printf ("%d\n",2*sum[1]*(n-sum[1]));
}
else {
int p;
scanf ("%d",&p);
edge e = edges[2*(p-1)];
int to = max(e.from,e.to);
update(cnt[to][0],cnt[to][1],1,n,1,1);
}
}
}
return 0;
}