#include using namespace std; const int MX = 100000, LOG = 17; namespace dsu { int p[MX]; void init(int n) { iota(p, p + n, 0); } int get(int v) { if (p[v] != v) p[v] = get(p[v]); return p[v]; } bool merge(int u, int v) { u = get(u); v = get(v); p[u] = v; return u != v; } } vector> G[MX]; int par[LOG][MX], mx[LOG][MX], g[MX], dep[MX]; void dfs(int v = 0, int p = 0, int w = 0, int id = 0, int d = 0) { g[v] = w; dep[v] = d; par[0][v] = p; mx[0][v] = id; for (int i = 0; i + 1 < LOG; i++) { par[i + 1][v] = par[i][par[i][v]]; mx[i + 1][v] = max(mx[i][v], mx[i][par[i][v]]); } for (auto& e : G[v]) { int u, c, id; tie(u, c, id) = e; if (u == p) continue; dfs(u, v, w ^ c, id, d + 1); } } int getMax(int u, int v) { if (dep[u] < dep[v]) swap(u, v); int res = 0; for (int i = LOG - 1; i >= 0; i--) if (dep[u] - (1 << i) >= dep[v]) { res = max(mx[i][u], res); u = par[i][u]; } for (int i = LOG - 1; i >= 0; i--) if (par[i][u] != par[i][v]) { res = max(mx[i][u], res); res = max(mx[i][v], res); u = par[i][u]; v = par[i][v]; } if (u != v) { res = max(mx[0][v], res); res = max(mx[0][u], res); } return res; } struct Query { int u, v, r, id; Query(int u, int v, int r, int id) : u(u), v(v), r(r), id(id) { } }; string ans[2 * MX]; int main() { int T; ignore = scanf("%d", &T); while (T--) { int n, q; ignore = scanf("%d %d", &n, &q); for (int i = 1, x; i < n; i++) ignore = scanf("%d %d", &x, &x); dsu::init(n); for (int i = 0; i < n; i++) G[i].clear(); vector queries; for (int i = 0, t, u, v, r; i < q; i++) { ignore = scanf("%d %d %d", &t, &u, &v); u--; v--; if (t == 1) { ignore = scanf("%d", &r); if (dsu::merge(u, v)) { G[u].emplace_back(v, r, i); G[v].emplace_back(u, r, i); ans[i] = "AC"; } else queries.emplace_back(u, v, r, i); } else queries.emplace_back(u, v, -1, i); } for (int i = 1; i < n; i++) if (dsu::merge(i, 0)) { G[i].emplace_back(0, 0, q); G[0].emplace_back(i, 0, q); } dfs(); for (Query& query : queries) { int f = g[query.u] ^ g[query.v]; if (query.r == -1) { int res = getMax(query.u, query.v) > query.id ? -1 : f; ans[query.id] = to_string(res); } else { ans[query.id] = query.r == f ? "AC" : "WA"; } } for (int i = 0; i < q; i++) printf("%s\n", ans[i].c_str()); } return 0; }