#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;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKCnZlY3Rvcjx2ZWN0b3I8aW50PiA+IGdyYXBoOwp2ZWN0b3I8aW50PiBzdHI7CnZlY3RvcjxpbnQ+IGVtZDsKdmVjdG9yPHBhaXI8cGFpcjxpbnQsaW50PixpbnQ+ID4gZWRnZXM7Cgp2ZWN0b3I8aW50PiBxMTsKdmVjdG9yPGludD4gcTI7CiAKaW50IHRpbWVyOwoKdm9pZCBkZnMoaW50IG5vZGUsaW50IHBhcmVudCl7CglzdHJbbm9kZV09dGltZXI7CgkKCWludCBsZW4gPSBncmFwaFtub2RlXS5zaXplKCk7Cglmb3IgKGludCBpPTA7aTxsZW47aSsrKXsKCQlpbnQgbm9kZTEgPSBncmFwaFtub2RlXVtpXTsKCQlpZiAobm9kZTEhPXBhcmVudCl7CgkJCXRpbWVyKz0xOwoJCQlkZnMobm9kZTEsbm9kZSk7CgkJfQoJfQoJZW1kW25vZGVdPXRpbWVyOwp9Cgp2ZWN0b3I8aW50PiBzZ3RyZWU7Cgp2b2lkIHVwZGF0ZShpbnQgbm9kZSxpbnQgc3RhcnQsaW50IGVuZCxpbnQgaWR4LGludCB2YWx1ZSl7CglpZiAoc3RhcnQ9PWVuZCl7CgkJc2d0cmVlW25vZGVdIF49IHZhbHVlOwoJCS8vY291dDw8c2d0cmVlPDxlbmRsOwoJCXJldHVybjsKCX0KCWVsc2V7CgkJaW50IG1pZCA9IChzdGFydCtlbmQpPj4xOwoJCWlmIChzdGFydDw9aWR4ICYmIGlkeDw9bWlkKXsKCQkJdXBkYXRlKDIqbm9kZSxzdGFydCxtaWQsaWR4LHZhbHVlKTsKCQl9CgkJZWxzZXsKCQkJdXBkYXRlKDIqbm9kZSsxLG1pZCsxLGVuZCxpZHgsdmFsdWUpOwoJCX0KCQlzZ3RyZWVbbm9kZV0gPSBzZ3RyZWVbMipub2RlXV5zZ3RyZWVbMipub2RlKzFdOwoJCS8vY291dDw8c2d0cmVlPDxlbmRsOwoJfQp9CgppbnQgcXVlcnkoaW50IG5vZGUsaW50IHN0YXJ0LGludCBlbmQsaW50IGwsaW50IHIpewoJaWYgKHI8c3RhcnQgfCBlbmQ8bCl7CgkJcmV0dXJuIDA7Cgl9CglpZiAobDw9c3RhcnQgJiYgZW5kPD1yKXsKCQlyZXR1cm4gc2d0cmVlW25vZGVdOwoJfQoJaW50IG1pZCA9IChzdGFydCtlbmQpPj4xOwoJaW50IHAxID0gcXVlcnkoMipub2RlLHN0YXJ0LG1pZCxsLHIpOwoJaW50IHAyID0gcXVlcnkoMipub2RlKzEsbWlkKzEsZW5kLGwscik7CglyZXR1cm4gKHAxXnAyKTsKfQoKCmludCBtYWluKCl7CglpbnQgdGVzdDsKCWNpbj4+dGVzdDsKCXdoaWxlKHRlc3QtLSl7CgkJaW50IG4sbTsKCQljaW4+Pm47CgkJZ3JhcGguY2xlYXIoKTsKCQlncmFwaC5yZXNpemUobisxKTsKCQkKCQlzdHIuY2xlYXIoKTsKCQlzdHIucmVzaXplKG4rMSk7CgkJZW1kLmNsZWFyKCk7CgkJZW1kLnJlc2l6ZShuKzEpOwoJCWVkZ2VzLmNsZWFyKCk7CgkJLy9lZGdlcy5yZXNpemUobisxKTsKCQkKCQkKCQl0aW1lcj0wOwoJCQoJCWZvciAoaW50IGk9MTtpPG47aSsrKXsKCQkJaW50IHUsdix3OwoJCQljaW4+PnU+PnY+Pnc7CgkJCWVkZ2VzLnB1c2hfYmFjayhtYWtlX3BhaXIobWFrZV9wYWlyKHUsdiksdykpOwoJCQkKCQkJZ3JhcGhbdV0ucHVzaF9iYWNrKHYpOwoJCQlncmFwaFt2XS5wdXNoX2JhY2sodSk7CgkJfQoJCWRmcygxLC0xKTsKCQkKCQl2ZWN0b3I8cGFpcjxpbnQsaW50PiA+IHNvcnRlZDsKCQkKCQlmb3IgKGludCBpPTA7aTxuLTE7aSsrKXsKCQkJaWYgKHN0cltlZGdlc1tpXS5maXJzdC5maXJzdF08c3RyW2VkZ2VzW2ldLmZpcnN0LnNlY29uZF0pewoJCQkJc3dhcChlZGdlc1tpXS5maXJzdC5maXJzdCxlZGdlc1tpXS5maXJzdC5zZWNvbmQpOwoJCQl9CgkJCXNvcnRlZC5wdXNoX2JhY2sobWFrZV9wYWlyKGVkZ2VzW2ldLnNlY29uZCwgLWVkZ2VzW2ldLmZpcnN0LmZpcnN0KSk7CgkJfQkJCgkJY2luPj5tOwoJCXExLmNsZWFyKCk7CgkJcTEucmVzaXplKG0pOwoJCXEyLmNsZWFyKCk7CgkJcTIucmVzaXplKG0pOwoJCQoJCXZlY3RvcjxpbnQ+YW5zKG0sMCk7CgkJCgkJZm9yIChpbnQgaT0wO2k8bTtpKyspewkJCQoJCQlpbnQgdSx2LGM7CgkJCWNpbj4+dT4+dj4+YzsKCQkJcTFbaV09dTsKCQkJcTJbaV09djsKCQkJc29ydGVkLnB1c2hfYmFjayhtYWtlX3BhaXIoYyxpKSk7CgkJfQoJCXNvcnQoc29ydGVkLmJlZ2luKCksc29ydGVkLmVuZCgpKTsKCQkKCQlzZ3RyZWUuY2xlYXIoKTsKCQlzZ3RyZWUucmVzaXplKDQwMDAwNSwwKTsKCQkKCQlpbnQgbGVuID0gc29ydGVkLnNpemUoKTsKCQlmb3IgKGludCBpPTA7aTxsZW47aSsrKXsKCQkJaWYgKHNvcnRlZFtpXS5zZWNvbmQ8MCl7CgkJCQlpbnQgbm9kZSA9IC1zb3J0ZWRbaV0uc2Vjb25kOwoJCQkJaW50IHZhbHVlID0gc29ydGVkW2ldLmZpcnN0OwoKCQkJCS8vIHVzZSBvZiBzZWdtZW50IHRyZWUgaXMgcmVxdWlyZWQgaGVyZQoJCQkJdXBkYXRlKDEsMCxuLTEsc3RyW25vZGVdLHZhbHVlKTsKCQkJCXVwZGF0ZSgxLDAsbi0xLGVtZFtub2RlXSsxLHZhbHVlKTsKCQkJfQoJCQllbHNlewoJCQkJLy8KCQkJCWludCBpZHggPSBzb3J0ZWRbaV0uc2Vjb25kOwoJCQkJYW5zW2lkeF0gPSBxdWVyeSgxLDAsbi0xLDAsc3RyW3ExW2lkeF1dKV5xdWVyeSgxLDAsbi0xLDAsc3RyW3EyW2lkeF1dKTsgCgkJCX0KCQl9CgkJCgkJZm9yIChpbnQgaT0wO2k8bTtpKyspewoJCQljb3V0PDxhbnNbaV08PGVuZGw7CgkJfQkKCX0KCXJldHVybiAwOwp9