#include <bits/stdc++.h>
#define lson (rt<<1)
#define rson (rt<<1|1)
#define mid ((l+r)>>1)

using namespace std;

const int MAXN = 30000 + 10;

struct Edge {
    int v, w, id, nxt;
    Edge() {}
    Edge(int _v, int _w, int _i, int _n) : v(_v), w(_w), id(_i), nxt(_n) {}
} E[MAXN << 1];

struct Node {
    int sum[2], rev;
    void markrev() {
        rev ^= 1;
        swap(sum[0], sum[1]);
    }
} SegTree[MAXN << 2];

map<string, int> word;
int G[MAXN], st[MAXN], ed[MAXN];
int belong[MAXN], dis[MAXN], pt[MAXN];
int N, M, sz;
char buf[1000];

void dfs(int u, int f) {
    pt[sz] = u; st[u] = sz ++;
    for (int now = G[u]; ~now; now = E[now].nxt) {
        int v = E[now].v, w = E[now].w; if (v == f) continue;
        belong[E[now].id] = v; dis[v] = dis[u] ^ w; dfs(v, u);
    }
    ed[u] = sz;
}

inline void pushdown(int rt) {
    if (SegTree[rt].rev) {
        SegTree[lson].markrev();
        SegTree[rson].markrev();
        SegTree[rt].rev = 0;
    }
}

void update(int rt) {
    SegTree[rt].sum[0] = SegTree[lson].sum[0] + SegTree[rson].sum[0];
    SegTree[rt].sum[1] = SegTree[lson].sum[1] + SegTree[rson].sum[1];
}

void build(int rt, int l, int r) {
    SegTree[rt].rev = 0;
    if (l + 1 == r) {
        SegTree[rt].sum[0] = SegTree[rt].sum[1] = 0;
        SegTree[rt].sum[dis[pt[l]]] = 1; return;
    }
    build(lson, l, mid); build(rson, mid, r);
    update(rt);
}

void modify(int rt, int l, int r, int L, int R) {
    if (L <= l && R >= r) {
        SegTree[rt].markrev();
        return;
    }
    pushdown(rt);
    if (L < mid) modify(lson, l, mid, L, R);
    if (R > mid) modify(rson, mid, r, L, R);
    update(rt);
}

int main() {
    int T; scanf("%d", &T);
    for (int cas = 1; cas <= T; ++ cas) {
        scanf("%d", &N);
        for (int i = 0; i < N; ++ i) {
            scanf("%s", buf); word[buf] = i;
        }
        for (int i = 0; i < N; ++ i) G[i] = -1; sz = 0;
        for (int i = 1; i < N; ++ i) {
            scanf("%s", buf); int u = word[buf];
            scanf("%s", buf); int v = word[buf];
            int w; scanf("%d", &w);
            E[sz] = Edge(v, w, i, G[u]); G[u] = sz ++;
            E[sz] = Edge(u, w, i, G[v]); G[v] = sz ++;
        }
        sz = 0; dis[0] = 0; dfs(0, -1);
        build(1, 0, sz);
        printf("Case #%d:\n", cas);
        for (scanf("%d", &M); M --; ) {
            scanf("%s", buf);
            if (buf[0] == 'Q') {
                int c0 = SegTree[1].sum[0];
                int c1 = SegTree[1].sum[1];
                printf("%d\n", c0 * c1 * 2);
            }
            else {
                int e; scanf("%d", &e);
                int u = belong[e];
                modify(1, 0, sz, st[u], ed[u]);
            }
        }
    }
    return 0;
}
