#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 30003
#define DIM 15005
using namespace std;
int N, M, K;
struct Muchie {
int x, y, c;
};
Muchie m[MAX];
int S[DIM], H[DIM];
int X, Y, gasit, sel[DIM];
typedef struct Nod {
int vf, c;
Nod* next;
} NOD, *PNOD;
PNOD L[DIM];
void QSort(int st, int dr);
void MSP();
int Find(int x);
void Union(int x, int y);
void Add(int x, int y, int z);
void DF(int nod, int drum);
int main()
{
FILE *fin = fopen("radiatie.in", "r");
FILE *fout = fopen("radiatie.out", "w");
fscanf(fin, "%d%d%d", &N, &M, &K);
for (int i = 1; i <= M; i++)
fscanf(fin, "%d%d%d", &m[i].x, &m[i].y, &m[i].c);
QSort(1, M);
MSP();
for (int i = 1; i <= K; i++)
{
fscanf(fin, "%d%d", &X, &Y);
memset(sel, 0, sizeof(sel));
gasit = 0;
DF(X, 0);
fprintf(fout, "%d\n", gasit);
}
fclose(fin);
fclose(fout);
return 0;
}
void QSort(int st, int dr)
{
int i = st, j = dr, pivot = m[(st + dr)/2].c;
do
{
while (m[i].c < pivot) i++;
while (m[j].c > pivot) j--;
if (i <= j)
{
Muchie aux = m[i];
m[i] = m[j];
m[j] = aux;
i++;
j--;
}
} while (i <= j);
if (i < dr) QSort(i,dr);
if (j > st) QSort(st, j);
}
void MSP()
{
for (int i = 1; i <= N; i++)
{
S[i] = i;
H[i] = 1;
}
int k = 1, pas = N - 1;
while (pas > 0 || k <= M)
{
int i = Find(m[k].x);
int j = Find(m[k].y);
if (i != j)
{
Union(i, j);
Add(i, j, m[k].c);
Add(j, i, m[k].c);
pas--;
}
k++;
}
}
int Find(int x)
{
if (x == S[x]) return x;
return S[x] = Find(S[x]);
}
void Union(int x, int y)
{
if (H[x] < H[y])
S[x] = S[y];
else
{
S[y] = S[x];
if (H[x] == H[y]) H[y]++;
}
}
void Add(int x, int y, int z)
{
PNOD p = new NOD;
p->vf = y;
p->c = z;
p->next = L[x];
L[x] = p;
}
void DF(int nod, int drum)
{
if (gasit) return;
int dnou = 0;
sel[nod] = 1;
for (PNOD p = L[nod]; p && !gasit; p = p->next)
if (!sel[p->vf])
{
sel[p->vf] = 1;
dnou = max(drum, p->c);
if (p->vf == Y) gasit = dnou;
else DF(p->vf, dnou);
}
}