#include <cstdio>
#include <algorithm>
#include <vector>
#define NMAX 15000
using namespace std;
int n,m,k,i,sol;
int str[13+5][NMAX+5],T[NMAX+5],H[NMAX+5],Max[13+5][NMAX+15];
vector < pair < int , pair < int , int > > > G;
vector < pair < int , int > > apm[NMAX+5];
bool ok[NMAX+5];
int multime(int nod)
{
if(nod==T[nod])
return nod;
T[nod]=multime(T[nod]);
return T[nod];
}
void dfs(int nod,int l)
{
int s=apm[nod].size(),x,c;
ok[nod]=true;
H[nod]=l;
for(int i=0; i<s; ++i)
{
x=apm[nod][i].first;
c=apm[nod][i].second;
if(!ok[x])
{
str[0][x]=nod;
Max[0][x]=c;
dfs(x,l+1);
}
}
}
void stramosi()
{
for(int b=1; b<=n; ++b)
for(int a=1; a<=13; ++a)
str[a][b]=str[a-1][str[a-1][b]];
}
void smax()
{
for(int b=1; b<=n; ++b)
for(int a=1; a<=13; ++a)
Max[a][b]=max(Max[a-1][b],Max[a-1][str[a-1][b]]);
}
int nivel(int nod,int h)
{
int i;
for(i=0; i<=13; ++i)
if((h>>i)&1)
{
sol=max(sol,Max[i][nod]);
nod=str[i][nod];
}
return nod;
}
int lca(int x,int y)
{
int Min;
sol=0;
if(H[x]!=H[y])
{
Min=min(H[x],H[y]);
if(H[x]!=Min)
x=nivel(x,H[x]-Min);
else y=nivel(y,H[y]-Min);
}
if(x==y)
{
printf("%d\n",sol);
return 0;
}
sol=0;
int step,i;
step=13;
for(i=0; step; step>>=1)
if(str[i+step][x]!=str[i+step][y])
i+=step;
return i;
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=1; i<=m; ++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G.push_back(make_pair(c,make_pair(a,b)));
}
sort(G.begin(),G.end());
for(i=1; i<=n; ++i)
T[i]=i;
for(i=0; i<m; ++i)
{
int e1,e2,c;
e1=G[i].second.first;
e2=G[i].second.second;
c=G[i].first;
if(multime(e1)!=multime(e2))
{
T[e2]=e1;
apm[e1].push_back(make_pair(e2,c));
apm[e2].push_back(make_pair(e1,c));
}
}
dfs(1,0);
stramosi();
smax();
for(i=1; i<=k; ++i)
{
int x,y,z;
scanf("%d%d",&x,&y);
z=lca(x,y);
if(!sol)
printf("%d\n",max(Max[z][x],Max[z][y]));
}
return 0;
}