//kruskal variation
#include<stdio.h>
#include<stdlib.h>
#define nmax 15005
#define nmaxx 30005
struct szar
{
int e1,e2;
long long cost;
};
szar el[nmaxx];
int fej[nmax],rg[nmax],w[nmax],wer[nmax];
long long max (int val1, int val2)
{
return ( (val1 > val2) ? val1: val2);
}
int cmp (const void *a, const void *b)
{
return (((szar*)a)->cost-((szar*)b)->cost);
}
int go (int x)
{
int r;
for (r=x;fej[r]!=r;r=fej[r]) ;
return r;
}
void egyesit (int x,int y,int q)
{
if (rg[x]>rg[y])
fej[y]=x, w[y]=q;
else
fej[x]=y, w[x]=q;
if (rg[x]==rg[y])
rg[y]++;
}
void bejar(int x,int r)
{
wer[x]+=r;
if (fej[x]!=x)
bejar(fej[x],r);
}
long long fin (int i)
{
if (wer[i]==2)
return 0;
return max(fin(fej[i]),w[i]);
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
int n,m,k,i,x,y;
scanf("%d%d%d",&n,&m,&k);
for (i=1;i<=m;++i)
scanf("%d%d%d",&el[i].e1,&el[i].e2,&el[i].cost);
el[0].cost=-1;
qsort(el,m+1,sizeof(szar),cmp);
int nr=0;
for(i=1;i<=n;++i)
{
rg[i]=1;
fej[i]=i;
}
//kruskal
int r1,r2;
for (i=1;nr<n-1;++i)
{
r1=go(el[i].e1);
r2=go(el[i].e2);
if (r1!=r2)
{
nr++;
egyesit(r1,r2,el[i].cost);
}
}
for (i=1;i<=k;++i)
{
scanf("%d%d",&x,&y);
bejar(x,1);
bejar(y,1);
printf("%lld\n",max(fin(x),fin(y)));
bejar(x,-1);
bejar(y,-1);
}
return 0;
}