#include<algorithm>
#include<cstdio>
#include<vector>
#define MMax 30005
#define NMax 15005
using namespace std;
struct muchie { int x,y,cost; };
muchie a[MMax];
int rang[NMax],p[NMax],lev[NMax];
int rmq[20][NMax],rmqv[20][NMax];
int n,lev_max;
vector<pair<int,int> > vc[NMax];
vector<pair<int,int> >::iterator it;
bool cmp (muchie aa, muchie bb)
{
return aa.cost<bb.cost;
}
void init ()
{
for (int i=1; i<=n; i++)
p[i]=i;
}
int find (int x)
{
if (x!=p[x])
p[x]=find(p[x]);
return p[x];
}
void unite (int x, int y)
{
if (rang[x]>rang[y])
p[y]=x;
else
p[x]=y;
if (rang[x]==rang[y])
rang[y]++;
}
void df (int nod)
{
int i;
for (i=0; i<vc[nod].size(); i++)
if (!lev[vc[nod][i].first])
{
lev[vc[nod][i].first]=lev[nod]+1;
rmq[0][vc[nod][i].first]=nod;
rmqv[0][vc[nod][i].first]=vc[nod][i].second;
df(vc[nod][i].first);
}
}
int lca (int x, int y)
{
int sol=0,niv,step;
if (lev[x]>lev[y])
swap(x,y);
niv=lev[y];
for (step=1; (1<<step)<=niv-lev[x]; step++);
for (; step>=0; step--)
if (niv-(1<<step)>=lev[x])
{
niv-=(1<<step);
sol=max(sol,rmqv[step][y]);
y=rmq[step][y];
}
for (step=1; (1<<step)<=lev[x]; step++);
for (; step>=0; step--)
if (rmq[step][x]!=rmq[step][y])
{
sol=max(sol,rmqv[step][x]);
sol=max(sol,rmqv[step][y]);
x=rmq[step][x];
y=rmq[step][y];
}
return sol;
}
int main ()
{
int i,r1,r2,k,m,step,x,y;
//freopen("radiatie.in","r",stdin);
//freopen("radiatie.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for (i=1; i<=m; i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].cost);
sort(a+1,a+m+1,cmp);
init();
for (i=1; i<=m; i++)
{
r1=find(a[i].x);
r2=find(a[i].y);
if (r1!=r2)
{
unite(r1,r2);
vc[a[i].x].push_back(make_pair(a[i].y,a[i].cost));
vc[a[i].y].push_back(make_pair(a[i].x,a[i].cost));
}
}
lev[1]=1;
df(1);
for (i=1; i<=n; i++)
lev_max=max(lev_max,lev[i]);
for (step=1; (1<<step)<=lev_max; step++)
for (i=1; i<=n; i++)
{
rmq[step][i]=rmq[step-1][rmq[step-1][i]];
rmqv[step][i]=max(rmqv[step-1][i],rmqv[step-1][rmq[step-1][i]]);
}
while (k--)
{
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}