#include <bits/stdc++.h>

using namespace std;
#define ll long long 

vector<vector<int> > graph;
vector<int> str;
vector<int> emd;
vector<pair<pair<int,int>,int> > edges;

vector<int> q1;
vector<int> q2;
 
int timer;

void dfs(int node,int parent){
	str[node]=timer;
	
	int len = graph[node].size();
	for (int i=0;i<len;i++){
		int node1 = graph[node][i];
		if (node1!=parent){
			timer+=1;
			dfs(node1,node);
		}
	}
	emd[node]=timer;
}

vector<int> sgtree;

void update(int node,int start,int end,int idx,int value){
	if (start==end){
		sgtree[node] ^= value;
		//cout<<sgtree<<endl;
		return;
	}
	else{
		int mid = (start+end)>>1;
		if (start<=idx && idx<=mid){
			update(2*node,start,mid,idx,value);
		}
		else{
			update(2*node+1,mid+1,end,idx,value);
		}
		sgtree[node] = sgtree[2*node]^sgtree[2*node+1];
		//cout<<sgtree<<endl;
	}
}

int query(int node,int start,int end,int l,int r){
	if (r<start | end<l){
		return 0;
	}
	if (l<=start && end<=r){
		return sgtree[node];
	}
	int mid = (start+end)>>1;
	int p1 = query(2*node,start,mid,l,r);
	int p2 = query(2*node+1,mid+1,end,l,r);
	return (p1^p2);
}


int main(){
	int test;
	cin>>test;
	while(test--){
		int n,m;
		cin>>n;
		graph.clear();
		graph.resize(n+1);
		
		str.clear();
		str.resize(n+1);
		emd.clear();
		emd.resize(n+1);
		edges.clear();
		//edges.resize(n+1);
		
		
		timer=0;
		
		for (int i=1;i<n;i++){
			int u,v,w;
			cin>>u>>v>>w;
			edges.push_back(make_pair(make_pair(u,v),w));
			
			graph[u].push_back(v);
			graph[v].push_back(u);
		}
		dfs(1,-1);
		
		vector<pair<int,int> > sorted;
		
		for (int i=0;i<n-1;i++){
			if (str[edges[i].first.first]<str[edges[i].first.second]){
				swap(edges[i].first.first,edges[i].first.second);
			}
			sorted.push_back(make_pair(edges[i].second, -edges[i].first.first));
		}		
		cin>>m;
		q1.clear();
		q1.resize(m);
		q2.clear();
		q2.resize(m);
		
		vector<int>ans(m,0);
		
		for (int i=0;i<m;i++){			
			int u,v,c;
			cin>>u>>v>>c;
			q1[i]=u;
			q2[i]=v;
			sorted.push_back(make_pair(c,i));
		}
		sort(sorted.begin(),sorted.end());
		
		sgtree.clear();
		sgtree.resize(400005,0);
		
		int len = sorted.size();
		for (int i=0;i<len;i++){
			if (sorted[i].second<0){
				int node = -sorted[i].second;
				int value = sorted[i].first;

				// use of segment tree is required here
				update(1,0,n-1,str[node],value);
				update(1,0,n-1,emd[node]+1,value);
			}
			else{
				//
				int idx = sorted[i].second;
				ans[idx] = query(1,0,n-1,0,str[q1[idx]])^query(1,0,n-1,0,str[q2[idx]]); 
			}
		}
		
		for (int i=0;i<m;i++){
			cout<<ans[i]<<endl;
		}	
	}
	return 0;
}