#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>L[100100];
struct lab{
int x;
int y;
int c;
}v[100100];
int n,m,k,i,j,a,b,nr,ra,rb,t[100100],C[100100],x[100100],viz[100100];
FILE *f,*g;
int cmp(lab a,lab b){
return a.c<b.c;
}
int rad(int r){
while(t[r]>0){
r=t[r];
}
return r;
}
void dfs(int nod,int niv){
x[nod]=niv;
viz[i]=1;
for(int i=0;i<L[nod].size();i++){
if(!viz[i])
dfs(L[nod][i],niv+1);
}
}
int maxim(int a,int b){
if(a>b)
return a;
return b;
}
int main(){
f=fopen("radiatie.in","r");
g=fopen("radiatie.out","w");
fscanf(f,"%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++){
t[i]=-1;
}
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&v[i].x,&v[i].y,&v[i].c);
}
sort(v+1,v+m+1,cmp);
for(i=1;i<=m;i++){
ra=rad(v[i].x);
rb=rad(v[i].y);
if(ra!=rb){
if(t[ra]<t[rb]){
t[ra]+=t[rb];
t[rb]=ra;
L[ra].push_back(rb);
C[rb]=v[i].c;
}
else{
t[rb]+=t[ra];
t[ra]=rb;
L[rb].push_back(ra);
C[ra]=v[i].c;
}
}
}
for(i=1;i<=n;i++){
if(t[i]<0){
dfs(i,1);
break;
}
}
for(i=1;i<=k;i++){
fscanf(f,"%d%d",&a,&b);
nr=0;
while( x[a] > x[b] ){
nr=maxim(nr,C[a]);
a=t[a];
}
while( x[a] < x[b] ){
nr=maxim(nr,C[b]);
b=t[b];
}
while(a!=b){
nr=maxim( nr, maxim( C[a],C[b] ) );
a=t[a];
b=t[b];
}
fprintf(g,"%d\n",nr);
}
fclose(f);
fclose(g);
return 0;
}