#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
FILE *f=fopen("radiatie.in","r");
FILE *g=fopen("radiatie.out","w");
int N,M,K;
pair<int,pair<int,int> > edge[30005];
vector<pair<int,int> > G[15005];
int T[15005];
int t[16][15005];
int mx[16][15005];
int lvl[15005];
int fi(int x)
{
if(!T[x])return x;
return T[x]=fi(T[x]);
}
void u(int x,int y,int c)
{
int Tx=fi(x);
int Ty=fi(y);
if(Tx==Ty)return ;
T[Tx]=Ty;
G[x].push_back({y,c});
G[y].push_back({x,c});
}
void dfs(int nod,int tata,int cost)
{
t[0][nod]=tata;
mx[0][nod]=cost;
lvl[nod]=1+lvl[tata];
for(auto it:G[nod])
if(it.first!=tata)
dfs(it.first,nod,it.second);
}
int solve(int x,int y)
{
int rez=0;
if(lvl[x]>lvl[y])
swap(x,y);
for(int pas=15;pas>=0;pas--)
{
if(lvl[y]-lvl[x]>=1<<pas)
{
rez=max(rez,mx[pas][y]);
y=t[pas][y];
}
}
if(x==y)return rez;
for(int pas=15;pas>=0;pas--)
{
if(t[pas][x]!=t[pas][y])
{
rez=max(rez,max(mx[pas][x],mx[pas][y]));
x=t[pas][x];
y=t[pas][y];
}
}
rez=max(rez,max(mx[0][x],mx[0][y]));
return rez;
}
int main()
{
fscanf(f,"%d %d %d",&N,&M,&K);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d %d",&edge[i].second.first,&edge[i].second.second,&edge[i].first);
}
sort(edge+1,edge+1+M);
for(int i=1;i<=M;i++)
u(edge[i].second.first,edge[i].second.second,edge[i].first);
dfs(1,0,0);
for(int lg=1;lg<16;lg++)
for(int i=1;i<=N;i++)
{
t[lg][i]=t[lg-1][t[lg-1][i]];
mx[lg][i]=max(mx[lg-1][i],mx[lg-1][t[lg-1][i]]);
}
for(int i=1;i<=K;i++)
{
int x,y;
fscanf(f,"%d %d",&x,&y);
fprintf(g,"%d\n",solve(x,y));
}
fclose(f);
fclose(g);
return 0;
}