#include <stdio.h>
#include <algorithm>
#include <vector>
#define N 15005
#define log 15
using namespace std;
struct latura
{
int a,b,c;
};
struct latura2
{
int x,c;
};
int n,m,k,i,j,x,y;
int t[N],lvl[N],anc[log][N],cost[log][N];
latura lat[N*2];
vector<latura2> g[N];
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
bool cmp(latura a,latura b)
{
return a.c<b.c;
}
int tata(int x)
{
if(t[x]==0)
return x;
t[x]=tata(t[x]);
return t[x];
}
void unire(int x,int y)
{
t[tata(x)]=tata(y);
}
void kruskal()
{
sort(lat,lat+m,cmp);
int nr=1,a,b,c;
for(i=0;i<m && nr<n;i++)
{
a=lat[i].a;
b=lat[i].b;
c=lat[i].c;
if(tata(a)!=tata(b))
{
nr++;
unire(a,b);
g[a].push_back({b,c});
g[b].push_back({a,c});
if(!anc[0][a])
{
anc[0][a]=b;
cost[0][a]=c;
}
else
{
anc[0][b]=a;
cost[0][b]=c;
}
}
}
}
int getrad()
{
for(i=1;i<=n;i++)
if(anc[0][i]==0)
return i;
}
void getlvl(int x,int ant)
{
for(int i=0;i<g[x].size();i++)
if(g[x][i].x!=ant)
{
lvl[g[x][i].x]=lvl[x]+1;
getlvl(g[x][i].x,x);
}
}
void build()
{
for(i=1;(1<<i)<=n;i++)
{
for(j=1;j<=n;j++)
{
anc[i][j]=anc[i-1][anc[i-1][j]];
cost[i][j]=max(cost[i-1][j],cost[i-1][anc[i-1][j]]);
}
}
}
int query(int x,int y)
{
int dif,minc,i;
if(lvl[x]<lvl[y])
swap(x,y);
dif=lvl[x]-lvl[y];
minc=0;
for(i=0;i<log;i++)
if(dif & (1<<i))
{
minc=max(minc,cost[i][x]);
x=anc[i][x];
}
for(i=0;i<log;i++)
if(anc[i][x]!=anc[i][y])
{
minc=max(minc,cost[i][x]);
minc=max(minc,cost[i][y]);
x=anc[i][x];
y=anc[i][y];
}
if(x!=y)
minc=max(minc,cost[0][x]);
return minc;
}
int main()
{
FILE *f1,*f2;
f1=fopen("radiatie.in","r");
f2=fopen("radiatie.out","w");
fscanf(f1,"%d%d%d",&n,&m,&k);
for(i=0;i<m;i++)
fscanf(f1,"%d%d%d",&lat[i].a,&lat[i].b,&lat[i].c);
kruskal();
getlvl(getrad(),0);
build();
for(i=0;i<k;i++)
{
fscanf(f1,"%d%d",&x,&y);
fprintf(f2,"%d\n",query(x,y));
}
return 0;
}