#include<stdio.h>
#include<algorithm>
#define MAX 15001
using namespace std;
int n,m,k,X,Y,T[MAX],R[MAX],L[3][3*MAX],cont,viz[MAX],ok,maxim;
struct muchie
{
int x,y,c;
}v[MAX*2];
int cmp(muchie a,muchie b)
{
return (a.c<b.c);
}
void compress(int x,int rad)
{
int var;
for(;x!=T[x];x = var)
{
var = T[x];
T[x] = rad;
}
}
int find(int x)
{
int i=x;
for(;i!=T[i];i=T[i]);
compress(x,i);
return i;
}
void unite(int x,int y)
{
if(R[x] >= R[y])
{
R[x]+=R[y];
T[y] = x;
}
else
{
R[y]+=R[x];
T[x] = y;
}
}
void add(int x,int y,int c)
{
if(!L[1][x])
{
L[1][x] = cont;
}
else
{
L[1][L[0][x]] = cont;
}
L[0][x] = cont;
L[0][cont] = y;
L[1][cont] = 0;
L[2][cont] = c;
++cont;
}
void apm()
{
int i,var = 1;
for(i=1;i<=m && var<=n-1;++i)
if(find(v[i].x)!=find(v[i].y))
{
//printf("%d %d\n",v[i].x,v[i].y);
unite(find(v[i].x), find(v[i].y));
add(v[i].x,v[i].y,v[i].c);
add(v[i].y,v[i].x,v[i].c);
++var;
}
}
int MAXIM(int a,int b)
{
if(a>=b)return a;
return b;
}
void DF(int nod,int nodf)
{
viz[nod] = cont;
if(nod!=nodf)
{
int var = L[1][nod];
while(var && !ok)
{
if(viz[L[0][var]] != cont)
DF(L[0][var],nodf);
if(ok)maxim = MAXIM(maxim,L[2][var]);
var = L[1][var];
}
}
else
{
ok = 1;
}
}
int main()
{
FILE*f = fopen("radiatie.in","r");
FILE*g = fopen("radiatie.out","w");
fscanf(f,"%d%d%d",&n,&m,&k);
int i;
cont = n+1;
for(i=1;i<=m;++i)
{
fscanf(f,"%d%d%d",&v[i].x,&v[i].y,&v[i].c);
if(i<=n){T[i] = i;R[i] = 1;}
}
sort(v+1,v+m+1,cmp);
apm();
cont = 1;
for(i=1;i<=k;++i)
{
fscanf(f,"%d%d",&X,&Y);
ok = 0;maxim = -1;
DF(X,Y);
fprintf(g,"%d\n",maxim);
++cont;
}
fclose(f);
fclose(g);
return 0;
}