#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n,m,k,dis[100010],vis[100010],s,head[100010],cnt;
struct u
{
int v,w,netx;
};
u edge[200010];
struct node
{
int x,y;
};
struct cmp
{
bool operator()(node xx,node yy)
{
return xx.x>yy.x;
}
};
priority_queue<node,vector<node>,cmp>q;
void add(int u,int v,int w)
{
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].netx=head[u];
head[u]=cnt;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
while(k!=0)
{
k--;
int x,yy;
scanf("%d%d",&x,&yy);
for(int i=1;i<=n;i++)
{
dis[i]=0x7fffffff;
}
dis[1]=0;
q.push({0,1});
while(!q.empty())
{
int uk=q.top().y;
q.pop();
if(vis[uk]) continue;
vis[uk]=1;
for(int i=head[uk];i;i=edge[i].netx)
{
if((dis[edge[i].v]>edge[i].w^dis[uk]))
{
dis[edge[i].v]=edge[i].w^dis[uk];
q.push({dis[edge[i].v],edge[i].v});
}
}
}
cout<<(dis[x]^dis[yy])<<endl;
}
return 0;
}