#include<stdio.h>
#include<stdlib.h>
#define MMAX 30010
#define NMAX 15010
#define nd(a) (*(t_edge *)(a))
typedef struct
{
int x, y, c;
}t_edge;
int cmp(const void *a, const void *b);
int gasit(int x);
void uneste(int x, int y, int cost);
int N, M, T[NMAX], rang[NMAX], d[NMAX], c[NMAX], Q;
t_edge edge[MMAX];
int main()
{
int i, j, max, a, b, aux;
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
scanf("%d%d%d", &N, &M, &Q);
for(i = 0; i < M; i++)
scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].c);
qsort(edge, M, sizeof(t_edge), cmp);
for(i = 1; i <= N; i++)
T[i] = i, d[i] = 1;
for(i = 0; i < M; i++)
{
if(gasit(edge[i].x) == gasit(edge[i].y)) continue;
uneste(gasit(edge[i].x), gasit(edge[i].y), edge[i].c);
}
for(i = 1; i <= N; i++) gasit(i);
for(i = 0; i < Q; i++)
{
scanf("%d%d", &a, &b);
max = 0;
if(d[a] < d[b]) aux = a, a = b, b = aux;
for(; d[a] > d[b]; a = T[a])
max = max < c[a] ? c[a] : max;
for(; a != b; a = T[a], b = T[b])
max = max < c[a] ? c[a] : max,
max = max < c[b] ? c[b] : max;
printf("%d\n", max);
}
return 0;
}
int cmp(const void *a, const void *b)
{
return nd(a).c - nd(b).c;
}
int gasit(int x)
{
int nr = 0, y;
y = x;
for(; x != T[x]; x = T[x], nr++);
d[y] = nr;
return x;
}
void uneste(int x, int y, int cost)
{
if(rang[x] <= rang[y])
{
T[x] = y, c[x] = cost;
if(rang[x] == rang[y])
rang[y]++;
}
else T[y] = x, c[y] = cost;
}