#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <utility>
using namespace std;
#define MAXN 15010
#define MAXM 30010
int C[MAXM];
inline int find(int *T, int x){
while(x!=T[x])
x=T[x];
return x;
}
inline void unite(int *T, int x, int y){
T[x]=y;
}
int cmp(int a, int b){
return C[a]<C[b];
}
int main(){
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
int N, M, K, i, j, a, b, cq, nq, found;
static int X[MAXM], Y[MAXM], IND[MAXM], B[MAXN], E[MAXN], T[MAXM], use[MAXN], min[MAXN];
vector< pair<int,int> > G[MAXN];
vector< pair<int,int> >::iterator ij;
vector<int> Q[2];
vector<int>::iterator ii;
scanf("%d%d%d", &N, &M, &K);
for(i=1; i<=M; i++)
scanf("%d%d%d", X+i, Y+i, C+i);
for(i=1; i<=K; i++)
scanf("%d%d", B+i, E+i);
for(i=1; i<=M; i++){
T[i]=i;
IND[i]=i;
}
sort(IND+1, IND+M+1, cmp);
for(i=1; i<=M; i++)
if((a=find(T, X[IND[i]])) != (b=find(T, Y[IND[i]]))){
unite(T, a, b);
G[X[IND[i]]].push_back(make_pair(Y[IND[i]], C[IND[i]]));
G[Y[IND[i]]].push_back(make_pair(X[IND[i]], C[IND[i]]));
}
for(i=1; i<=K; i++){
Q[0].clear();
Q[1].clear();
cq=0; Q[cq].push_back(B[i]);
memset(use, 0, sizeof(use));
use[B[i]]=1;
for(j=1; j<=N; j++)
min[j]=0;
found=0;
while(!Q[cq].empty()){
nq=1-cq;
for(ii = Q[cq].begin(); ii != Q[cq].end(); ii++){
if(*ii == E[i]){
found=1;
break;
}
for(ij = G[*ii].begin(); ij != G[*ii].end(); ij++)
if(!use[ij->first]){
use[ij->first]=1;
Q[nq].push_back(ij->first);
if(min[*ii] < ij->second)
min[ij->first]=ij->second;
else
min[ij->first]=min[*ii];
}
}
if(found)
break;
Q[cq].clear();
cq=nq;
}
printf("%d\n", min[E[i]]);
}
return 0;
}