#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
struct punct
{
int x, y, c;
}u[15002];
struct aaa
{
int x, y;
};
int n,m, k, x, y, c, X, Y, Max,p[50002], M,t[50002], ct, rx, ry, i;
vector<aaa>G[15002];
bool ap[15002];
int dfs(int x)
{
if (x==Y) return 1;
int ok=0;
int o;
ap[x]=1;
for (int i=0; i<G[x].size(); i++){
o=0;
if (ap[G[x][i].x]==0) o=dfs(G[x][i].x);
if (o) {if (G[x][i].y>Max) Max=G[x][i].y; ok=1;}
if (ok) break;
}
ap[x]=0;
return ok;
}
bool cmp(punct x, punct y)
{
return (x.c<y.c);
}
int root (int x)
{
while (t[x]!=x) x=t[x];
return x;
}
void unific (int x, int y)
{
if (p[x]<p[y]) t[x]=y;
if (p[x]>p[y]) t[y]=x;
if (p[x]==p[y]){
t[y]=x;
p[x]++;
}
}
void kruskal()
{
sort(u+1, u+m+1, cmp);
i=1;
while (k<n-1){
rx=root(u[i].x);
ry=root(u[i].y);
if (rx!=ry){
++k;
ct+=u[i].c;
G[u[i].x].push_back({u[i].y, u[i].c});
G[u[i].y].push_back({u[i].x, u[i].c});
unific(rx, ry);
}
i++;
}
}
int main ()
{
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
scanf("%d%d%d", &n, &m, &M);
for (i=1; i<=m; i++){
scanf("%d%d%d", &x, &y, &c);
u[i].x=x; u[i].y=y; u[i].c=c;
t[i]=i;
}
kruskal();
for (i=1; i<=M; i++){
scanf("%d%d", &X, &Y);
Max=0;
// memset(ap, 0, sizeof(ap));
x=dfs(X);
printf("%d\n", Max);
}
return 0;
}