#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 15000
using namespace std;
int n,m,k,i,sol;
int T[NMAX+5];
vector <pair <int,pair <int,int> > >tst;
vector <pair <int,int> >G[NMAX+5];
int lvl[NMAX+5],str[15][NMAX+5],dmax[15][NMAX+5];
int multime(int node)
{
if(node==T[node])
return node;
int y=multime(T[node]);
T[node]=y;
return y;
}
void dfs(int node, int dad,int cost)
{
lvl[node]=lvl[dad]+1;
str[0][node]=dad;
dmax[0][node]=cost;
int s=G[node].size(),i,crt;
for(i=0; i<s; ++i)
{
crt=G[node][i].first;
if(crt!=dad)
dfs(crt,node,G[node][i].second);
}
}
void stramosi()
{
int a,b;
for(a=1; a<=13; ++a)
for(b=1; b<=n; ++b)
{
str[a][b]=str[a-1][str[a-1][b]];
if(str[a][b])
dmax[a][b]=max(dmax[a-1][b],dmax[a-1][str[a-1][b]]);
}
}
int rise(int node, int x)
{
for(int i=0; i<=13; ++i)
if((x>>i)&1)
{
sol=max(sol,dmax[i][node]);
node=str[i][node];
}
return node;
}
int lca(int node1,int node2)
{
if(lvl[node1]<lvl[node2])
swap(node1,node2);
node1=rise(node1,lvl[node1]-lvl[node2]);
for(int i=13; i>=0; --i)
if(str[i][node1]!=str[i][node2])
{
sol=max(sol,max(dmax[i][node1],dmax[i][node2]));
node1=str[i][node1];
node2=str[i][node2];
}
if(node1!=node2)
{
sol=max(sol,max(dmax[0][node1],dmax[0][node2]));
return str[0][node1];
}
else return node1;
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=0; i<m; ++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
tst.push_back(make_pair(c,make_pair(a,b)));
}
for(i=1; i<=n; ++i)
T[i]=i;
sort(tst.begin(),tst.end());
for(i=0; i<m; ++i)
{
int node1,node2,cost,m1,m2;
cost=tst[i].first;
node1=tst[i].second.first;
node2=tst[i].second.second;
m1=multime(node1);
m2=multime(node2);
if(m1!=m2)
{
T[m1]=m2;
G[node1].push_back(make_pair(node2,cost));
G[node2].push_back(make_pair(node1,cost));
}
}
lvl[0]=-1;
dfs(1,0,0);
stramosi();
for(i=1; i<=k; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
sol=0;
int L=lca(x,y);
printf("%d\n",sol);
}
return 0;
}