#include<cstdio>
#include<fstream>
#include<vector>
#include<algorithm>
#include<iostream>
#define MAX 15005
using namespace std;
struct muchie{
int i,j,c;
friend bool operator <(const muchie &a, const muchie &b)
{
return a.c<b.c;
}
};
struct nod{
int i,c;
nod *next;
};
muchie v[30005];
nod *G[MAX];
int t[MAX],h[MAX],na,n,m,a[MAX],radacini[MAX],nrad,vrad[MAX],viz[MAX];
int radacina(int x)
{
int y=x,tmp;
while(t[x])
x=t[x];
while(t[y])
tmp=t[y],t[y]=x,y=tmp;
return x;
}
void addmuchie(int x,int y,int c)
{
nod *p=new nod;
p->c=c;
p->i=y;
p->next=G[x];
G[x]=p;
p=new nod;
p->c=c;
p->i=x;
p->next=G[y];
G[y]=p;
}
void afisgraf()
{
nod *p;
int i;
for(i=1;i<=n;i++)
{
printf("%d: ",i);
for(p=G[i];p;p=p->next)
printf("(%d,%d) ",p->i,p->c);
printf("\n");
}
}
void dfs(int varf,int final)
{
viz[varf]=1;
for(nod *p=G[varf] ; p ; p=p->next)
{
int vecin=p->i;
if(viz[vecin]==0)
{
viz[vecin]=1;
t[vecin]=varf;
if(vecin==final)
return;
dfs(vecin,final);
}
}
}
int costu(int x,int y)
{
nod *p;
for(p=G[x]; p->i!=y ;p=p->next);
return p->c;
}
int main()
{
int k,i,max;
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d %d %d", &n, &m, &k);
for(i=1;i<=m;i++)
{
int x,y,c;
scanf("%d %d %d", &x, &y, &c);
v[i].i=x;
v[i].j=y;
v[i].c=c;
}
sort(v+1,v+m+1);
for(i=1;i<=m;i++)//apm
{
int ri=radacina(v[i].i),rj=radacina(v[i].j);
if(ri!=rj)
{
a[++na]=i;
if(h[ri]<h[rj])
t[ri]=rj;
else if(h[rj]<h[ri])
t[rj]=ri;
else
t[ri]=rj,h[rj]++;
}
}
for(i=1;i<=n;i++)//vad cati arbori exista dupa apm si tin minte rad lor;
if(vrad[t[i]]==0 && t[i]!=0)
radacini[++nrad]=t[i],vrad[t[i]]=1;
for(i=1;i<=na;i++)
addmuchie(v[a[i]].i,v[a[i]].j,v[a[i]].c);
for(i=1;i<=k;i++)
{
int x,y;
max=0;
scanf("%d %d", &x, &y);
for(int qq=1;qq<=n;qq++)
t[qq]=0,viz[qq]=0;
viz[x]=1;
dfs(x,y);
while(t[y]!=0)
{
int costul=costu(y,t[y]);
//printf("%d %d\n", y, t[y]);
if(costul>max)
max=costul;
y=t[y];
}
printf("%d\n",max);
}
return 0;
}