#include <bits/stdc++.h>
#define maxN 15005
#define maxLog 15
using namespace std;
int t[maxN],lvl[maxN];
vector<pair<int,int> >v[maxN];
vector<pair<int,pair<int,int> > >edges;
int n,m,k,i,j,x,y,z,tx,ty;
int anc[maxLog][maxN],bst[maxLog][maxN];
int Find(int x)
{
if(t[x]==x)
return x;
return t[x]=Find(t[x]);
}
void Union(int x,int y)
{
t[Find(x)]=Find(y);
}
void dfs(int nod,int tata)
{
lvl[nod]=lvl[tata]+1;
vector<pair<int,int> >::iterator it;
for(it=v[nod].begin();it!=v[nod].end();it++)
if(it->first!=tata)
{
anc[0][it->first]=nod;
bst[0][it->first]=it->second;
dfs(it->first,nod);
}
}
int query(int x,int y)
{
if(lvl[x]<lvl[y])
swap(x,y);
int len=lvl[x]-lvl[y],sol=0;
for(int i=0;i<maxLog;i++)
if(len&(1<<i))
sol=max(sol,bst[i][x]),
x=anc[i][x];
if(x==y)
return sol;
for(int i=maxLog-1;i>=0;i--)
if(anc[i][x]!=anc[i][y])
{
sol=max(sol,max(bst[i][x],bst[i][y]));
x=anc[i][x];
y=anc[i][y];
}
sol=max(sol,max(bst[0][x],bst[0][y]));
return sol;
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=n;i++)
t[i]=i;
for(i=1;i<=m;i++)
scanf("%d %d %d",&x,&y,&z),
edges.push_back(make_pair(z,make_pair(x,y)));
sort(edges.begin(),edges.end());
for(auto it:edges)
{
x=it.second.first;
y=it.second.second;
tx=Find(x);
ty=Find(y);
if(tx==ty)
continue;
Union(x,y);
v[x].push_back(make_pair(y,it.first));
v[y].push_back(make_pair(x,it.first));
}
dfs(1,0);
for(i=1;i<maxLog;i++)
for(j=1;j<=n;j++)
anc[i][j]=anc[i-1][anc[i-1][j]],
bst[i][j]=max(bst[i-1][j],bst[i-1][anc[i-1][j]]);
while(k--)
{
scanf("%d %d",&x,&y);
printf("%d\n",query(x,y));
}
return 0;
}