#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;
};
struct nnod{
int info;
nnod*adr;
};
typedef nnod*pnn;
struct llista{
int nr;
pnn vf,sf;
};
llista ll[NM];
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,st,dr;
pnn nc;
while(ms<n-1){
while(cc[v[i].x]==cc[v[i].y]) i++;
ms++;h[k++]=v[i];
if(ll[cc[v[i].x]].nr>ll[cc[v[i].y]].nr){
max=ll[cc[v[i].x]].nr,min=ll[cc[v[i].y]].nr;
dr=cc[v[i].x],st=cc[v[i].y];
}
else {
max=ll[cc[v[i].y]].nr,min=ll[cc[v[i].x]].nr;
st=cc[v[i].x],dr=cc[v[i].y];
};
/*for(j=1;j<=n;++j)
if(cc[j]==max) cc[j]=min;*/
nc=ll[st].vf;
while(nc){
cc[nc->info]=dr;
nc=nc->adr;
}
ll[dr].sf->adr=ll[st].vf;
ll[dr].sf=ll[st].sf;
ll[st].vf=NULL,ll[st].nr=0;
ll[dr].nr+=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;
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);
pnn nn;
for(i=1;i<=n;++i){
cc[i]=i;
nn=new nnod;
nn->info=i;
nn->adr=NULL;
ll[i].nr=1;
ll[i].vf=ll[i].sf=nn;
}
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;
}