传送门
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
;int x,y,z;
,head[N],dis[N];bool vis[N];
];
//无向图存边数组开两倍
void add(int u,int v,int w){
edge[++k].to=v;edge[k].next=head[u];edge[k].w=w;head[u]=k;
}
void dfs(int now,int val){
//dis[tmp]^dis[tmp]^dis[u]^dis[v]=dis[u]^dis[v]
//所以只要求每一个和根节点的异或值就可以了
dis[now]=val;vis[now]=true;
//now到根节点的异或边权即为val
//这个点已经找过了
for(register int i=head[now];i;i=edge[i].next){
//从这个点所在的图的边的起点开始向后找
if(!vis[edge[i].to]) dfs(edge[i].to,val^edge[i].w);
//如果在这个没有搜过,就顺着向下搜,异或值就是现在的^要走过的
}
}
int main(){
scanf("%d",&n);
;i<=n-;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
dfs(,);/*从根节点开始找,根节点和自己的异或值就是零*/scanf("%d",&m);
;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",dis[x]^dis[y]);
}
}