#include using namespace std; const int MaxN = 1e5 + 10; const int MaxL = 18; vector < pair < int, int > > g[MaxN]; int dep[MaxN], pre[MaxN]; int tin[MaxN], tout[MaxN], timer; int fenw[MaxN]; void dfs(int v, int p) { tin[v] = ++timer; for (int i = 0; i < (int)g[v].size(); ++i) { int to = g[v][i].first; if (to == p) { continue; } pre[to] = g[v][i].second; dep[to] = dep[v] + 1; dfs(to, v); } tout[v] = timer; } void upd(int r, int val) { while (r < MaxN) { fenw[r] ^= val; r |= r + 1; } } int get(int r) { int ans = 0; while (r >= 0) { ans ^= fenw[r]; r &= r + 1, --r; } return ans; } int main() { // freopen("input.txt", "r", stdin); int t; cin >> t; while (t --> 0) { int n, m; scanf("%d", &n); assert (1 <= n && n <= 1e5); for (int i = 1; i <= n; ++i) { g[i].clear(); } memset(fenw, 0, sizeof(fenw)); vector < pair < pair < int, int >, pair < int, int > > > events; for (int i = 0; i < n - 1; ++i) { int x, y, c; scanf("%d%d%d", &x, &y, &c); assert (1 <= x && x <= n); assert (1 <= y && y <= n); assert (1 <= c && c <= 1e9); events.push_back(make_pair(make_pair(c, -1), make_pair(x, y))); g[x].push_back(make_pair(y, c)); g[y].push_back(make_pair(x, c)); } timer = 0; dfs(1, 0); scanf("%d", &m); assert (1 <= n && m <= 1e5); vector < int > ans(m); for (int i = 0; i < m; ++i) { int x, y, k; scanf("%d%d%d", &x, &y, &k); events.push_back(make_pair(make_pair(k, i), make_pair(x, y))); assert (1 <= x && x <= n); assert (1 <= y && y <= n); assert (1 <= k && k <= 1e9); } sort(events.begin(), events.end()); for (auto event : events) { int x = event.second.first; int y = event.second.second; // cout << event.first.first << ' ' << event.first.second << ' ' << x << ' ' << y << endl; if (event.first.second == -1) { if (dep[y] > dep[x]) { swap(x, y); } upd(tin[x], event.first.first); upd(tout[x] + 1, event.first.first); } else { ans[event.first.second] = get(tin[x]) ^ get(tin[y]); } } for (int i = 0; i < m; ++i) { printf("%d\n", ans[i]); } } return 0; }