#include <cstdio>
#include <vector>
#include <algorithm>
#define INF "radiatie.in"
#define OUF "radiatie.out"
#define pb push_back
#define sz(arg) arg.size()
using namespace std;
const int NMAX=16002;
const int MMAX=30002;
const int BIG=2000000000;
struct arc
{
short x,y;
int l;
};
struct arc2
{
short nb;
int l;
};
short n,m,k,niv[NMAX]={0},cc[NMAX]={0},t[NMAX]={0};
int lng[NMAX]={0};
char viz[NMAX]={0};
vector<arc2> a[NMAX];//ARBORE
vector<arc> ed;
bool cmp(arc alfa,arc beta) {return (alfa.l<beta.l);}
void apm()
{
sort(ed.begin(),ed.end(),cmp);
short i,j,nbx,nby,nr,aux;
arc2 ab;
for(i=1;i<=n;++i) cc[i]=i;//componenta conexa in care este i
i=0;nr=n-1;
while(nr>0&&i<m)
{
while(i<m&&cc[ed[i].x]==cc[ed[i].y]) ++i;
nbx=ed[i].x;nby=ed[i].y;
ab.l=ed[i].l;
ab.nb=nby;a[nbx].push_back(ab);
ab.nb=nbx;a[nby].push_back(ab);
//printf("%hd %hd\n",nbx,nby);
aux=cc[nby];
for(j=1;j<=n;++j)
{
//printf("%hd ",cc[j]);
if(cc[j]==aux) cc[j]=cc[nbx];
// printf("%hd ",cc[j]);
}
// printf("\n");
--nr;
}
}
void dfs(short nd,short lev)
{
short i,nb;
viz[nd]=1;niv[nd]=lev;
for(i=0;i<sz(a[nd]);++i)
if(!viz[a[nd][i].nb])
{
nb=a[nd][i].nb;
t[nb]=nd;lng[nb]=a[nd][i].l;
dfs(nb,lev+1);
}
}
int query(short x,short y)
{
int mx=-1;
short i,j;
i=x;j=y;
if(niv[i]>niv[j])
{
while(i>1&&niv[i]>niv[j])
{
mx=max(mx,lng[i]);
i=t[i];
}
}
else
{
while(j>1&&niv[j]>niv[i])
{
mx=max(mx,lng[j]);
j=t[j];
}
}
while(i>1&&i!=j)
{
mx=max(mx,lng[i]);
mx=max(mx,lng[j]);
i=t[i];j=t[j];
}
return mx;
}
int main()
{
FILE *in,*out;
in=fopen(INF,"r");
out=fopen(OUF,"w");
short i,j,alfa,beta;
int v;
arc x;
fscanf(in,"%hd%hd%hd",&n,&m,&k);
for(i=0;i<m;++i)
{
fscanf(in,"%hd%hd%d",&x.x,&x.y,&x.l);
ed.push_back(x);
}
apm();
//for(i=0;i<=n;++i) lng[i]=BIG;
dfs(1,1);
for(i=1;i<=n;++i) if(sz(a[i])<1) printf("%c",viz[BIG]);// printf("%d ",lng[i]);
for(i=1;i<=k;++i)
{
fscanf(in,"%hd%hd",&alfa,&beta);
v=query(alfa,beta);
fprintf(out,"%d\n",v);
// if(v<1) while(1);
}
fclose(in);fclose(out);
return 0;
}