// Radiatie
#include <cstdio>
#include <algorithm>
#define NMAX 15011
using namespace std;
int N,M,Q;
int Dad[NMAX],Rang[NMAX],Cost[NMAX],Viz[NMAX];
struct edge{
int x,y,c;
} V[2*NMAX+1];
bool Cmp(edge X, edge Y){
return X.c<Y.c;
}
inline int Maxim(int X,int Y){
if(X>=Y) return X;
return Y;
}
inline int Find (int X){
for(;X!=Dad[X];X=Dad[X]);
return X;
}
void Unite(int X, int Y, int C){
if(Rang[X]<Rang[Y]){
Dad[X]=Y;
Cost[X]=C;
}
else {
Dad[Y]=X;
Cost[Y]=C;
}
if(Rang[X]==Rang[Y]) Rang[X]++;
}
void Kruskal(){
int i,X,Y;
for(i=1;i<=N;i++)
Dad[i]=i;
sort(V+1,V+M+1, Cmp);
for(i=1;i<=M;i++){
X=Find(V[i].x);
Y=Find(V[i].y);
if(X!=Y){
Unite(X,Y,V[i].c);
}
}
}
int LCA(int X, int Y, int i){
for(;X!=Dad[X]; Viz[X]=i, X=Dad[X]);
for(;Y!=Dad[Y] && Viz[Y]!=i; Y=Dad[Y]);
return Y;
}
int Query(int X, int Y, int i){
int R,C;
C=0;
R=LCA(X,Y,i);
for(;X!=R;X=Dad[X]) C=Maxim(C,Cost[X]);
for(;Y!=R;Y=Dad[Y]) C=Maxim(C,Cost[Y]);
return C;
}
void Read(){
int i=0;
freopen("radiatie.in","r",stdin);
scanf("%d %d %d", &N, &M, &Q);
for(i=1; i<=M; i++){
scanf("%d %d %d", &V[i].x, &V[i].y, &V[i].c);
}
}
void Solve(){
int x,y;
freopen("radiatie.out","w",stdout);
Kruskal();
for(;Q>0;Q--){
scanf("%d %d",&x,&y);
printf("%d\n",Query(x,y,Q));
}
}
int main(){
Read();
Solve();
return 0;
}