#include<stdio.h>
#include<stdlib.h>
#define NM 15001
#define MM 30001
struct edge{
int x,y,c;
};
typedef edge*pe;
struct nod{
int vecin,c;
nod*adr;
};
typedef nod*pnod;
struct lista{
pnod vf,sf;
};
lista l[NM];
edge v[MM],h[NM];
int n,m,k,cc[NM],c[NM],li,ls,d[NM];
int fcmp(void const*a,void const*b){
return ((pe)a)->c-((pe)b)->c;
}
void apm(){
int i=0,j,k=0,min,max,ms=0;
while(ms<n-1){
while(cc[v[i].x]==cc[v[i].y]) i++;
ms++;h[k++]=v[i];
if(cc[v[i].x]>cc[v[i].y]) max=cc[v[i].x],min=cc[v[i].y];
else max=cc[v[i].y],min=cc[v[i].x];
for(j=1;j<=n;++j)
if(cc[j]==max) cc[j]=min;
}
}
void addend(lista &ll,int x,int c){
pnod nn=new nod;
nn->vecin=x;
nn->c=c;
nn->adr=NULL;
if(!(ll.vf)) ll.vf=nn;
else ll.sf->adr=nn;
ll.sf=nn;
}
void pune(int x){c[++ls]=x;}
void scoate(int &x){x=c[li++];}
void dfs(int a){
int i,j;
li=1,ls=0;
int viz[NM]={0};
for(i=1;i<=n;++i) d[i]=0;
pnod nc,nn;
pune(a);
while(li<=ls){
scoate(i);
nc=l[i].vf;
while(nc){
j=nc->vecin;
if(!viz[j]) {
pune(j);
viz[j]=1;
if(d[i]<nc->c) d[j]=nc->c;
else d[j]=d[i];
}
nc=nc->adr;
}
}
d[a]=-1;
return ;
}
int main(){
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
int i,j,x,y,aux;
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<m;++i)
scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].c);
qsort(v,m,sizeof(v[0]),fcmp);
for(i=1;i<=n;++i) cc[i]=i;
apm();
for(i=0;i<n-1;++i) {
addend(l[h[i].x],h[i].y,h[i].c);
addend(l[h[i].y],h[i].x,h[i].c);
}
for(j=0;j<k;++j){
scanf("%d%d",&x,&y);
if(x>y) aux=x,x=y,y=aux;
if(d[x]!=-1) dfs(x);
aux=d[y];
printf("%d\n",aux);
}
return 0;
}