#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define PB push_back
struct muchie { int u, v, c; };
struct nod { int u, c; };
bool operator<(const muchie &a, const muchie &b) {
return a.c < b.c;
}
const int MMAX = 32768;
const int NMAX = 16384;
int N, M, K, H;
muchie A[MMAX];
vector <nod> G[NMAX];
bool V[NMAX];
int T[NMAX], T2[NMAX], LEV[NMAX];
int R[NMAX], R2[NMAX];
int parinte(int T[], int u) {
if (T[u] != u)
T[u] = parinte(T, T[u]);
return T[u];
}
void unite(int T[], int GR[], int u, int v, int c) {
int tu, tv;
nod aux;
tu = parinte(T, u);
tv = parinte(T, v);
if (tu != tv) {
if (GR[tu] > GR[tv])
T[tv] = tu;
else
T[tu] = tv;
if (GR[tu] == GR[tv]) ++GR[tu];
aux.c = c;
aux.u = v;
G[u].PB(aux);
aux.u = u;
G[v].PB(aux);
}
}
void kruskal() {
int i;
int T[NMAX], GR[NMAX];
sort(A, A + M);
for (i = 1; i <= N; ++i)
T[i] = i, GR[i] = 0;
for (i = 0; i < M; ++i)
unite(T, GR, A[i].u, A[i].v, A[i].c);
}
int getheight(int k) {
unsigned i;
int H = 1;
V[k] = true;
for (i = 0; i < G[k].size(); ++i)
if (V[ G[k][i].u ] == false)
H = max(H, 1 + getheight(G[k][i].u));
return H;
}
void DFS(int k, int t2, int lev, int rad) {
unsigned i;
int v;
T2[k] = t2; LEV[k] = lev; R2[k] = rad;
// printf("%d t=%d t2=%d lev=%d r=%d r2=%d\n", k, T[k], T2[k], lev, R[k], R2[k]);
if (lev % H == 0) t2 = k, rad = 0;
for (i = 0; i < G[k].size(); ++i) {
v = G[k][i].u;
if (T[v] == -1)
T[v] = k, R[v] = G[k][i].c,
DFS(v, t2, lev + 1, max(rad, G[k][i].c));
}
}
int LCA(int u, int v) {
int r = 0;
while (T2[u] != T2[v])
if (LEV[u] > LEV[v])
r >?= R2[u], u = T2[u];
else
r >?= R2[v], v = T2[v];
while (u != v)
if (LEV[u] > LEV[v])
r >?= R[u], u = T[u];
else
r >?= R[v], v = T[v];
return r;
}
int main() {
FILE *fin = fopen("radiatie.in", "rt");
FILE *fout = fopen("radiatie.out", "wt");
int i, u, v;
fscanf(fin, " %d %d %d", &N, &M, &K);
for (i = 0; i < M; ++i)
fscanf(fin, " %d %d %d", &A[i].u, &A[i].v, &A[i].c);
kruskal();
for (i = 1; i <= N; ++i)
if (V[i] == false)
H = max(H, getheight(i));
H = (int) sqrt( (double) H );
for (i = 1; i <= N; ++i)
T[i] = -1;
for (i = 1; i <= N; ++i)
if (T[i] == -1)
T[i] = 0,
DFS(i, 0, 0, 0);
for (i = 0; i < K; ++i) {
fscanf(fin, " %d %d", &u, &v);
fprintf(fout, "%d\n", LCA(u, v));
}
fclose(fin);
fclose(fout);
return 0;
}