#include<stdio.h>
#include<vector>
#include<algorithm>
#define MAXIMM 30005
#define MAXN 15005
#define LOGBA 20
using namespace std;
FILE *in, *out;
struct muchie
{
int a, b, val;
};
struct nozi
{
int catre, cost;
};
muchie trare[MAXIMM];
int cap[MAXN], dpt[MAXN], n, m, k;
vector <nozi> g[MAXN];
char viz[MAXN];
nozi tatici[LOGBA + 1][MAXN];
int gase(int elem)
{
if(cap[elem] != elem) {
elem = gase(cap[elem]);
}
return elem;
}
void unesc(int a, int b)
{
a = gase(a);
b = gase(b);
if(dpt[a] > dpt[b]) {
cap[b] = a;
} else {
cap[a] = b;
if(dpt[a] == dpt[b]) {
dpt[a]++;
}
}
}
void dfs(int nod, int adan)
{
/* //printf("\n%d----defeu-------------\n", adan);
for(int i = 1; i <= n; i++) {
//printf("%d ", viz[i]);
}
*/
for(unsigned int i = 0; i < g[nod].size(); i++) {
if(viz[g[nod][i].catre] == 0) {
viz[g[nod][i].catre] = adan + 1;
tatici[1][g[nod][i].catre].catre = nod;
tatici[1][g[nod][i].catre].cost = g[nod][i].cost;
dfs(g[nod][i].catre, adan + 1);
}
}
}
bool sortapm(muchie a, muchie b)
{
return a.val < b.val;
}
int main ()
{
in = fopen("radiatie.in", "r");
out = fopen("radiatie.out", "w");
fscanf(in, "%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++) {
cap[i] = i;
tatici[0][i].catre = i;
tatici[0][i].cost = 0;
dpt[i] = 1;
}
for(int i = 0; i < m; i++) {
fscanf(in, "%d%d%d", &trare[i].a, &trare[i].b, &trare[i].val);
}
sort(trare, trare + m, sortapm);
/*
for(int i = 0; i < m; i++) {
//printf(stdout, "%d %d %d\n", trare[i].a, trare[i].b, trare[i].val);
}
*/
for(int i = 0; i < m; i++) {
if(gase(trare[i].a) != gase(trare[i].b)) {
unesc(trare[i].a, trare[i].b);
} else {
trare[i].a = 0;
trare[i].b = 0;
trare[i].val = 0;
}
/*
for(int j = 1; j <= n; j++) {
//printf("%d ", cap[j]);
} //printf("\n");
for(int j = 1; j <= n; j++) {
//printf("%d ", dpt[j]);
}//printf("\n-------\n");
*/
}
for(int i = 0; i < m; i++) {
if(trare[i].a != 0) {
nozi x;
x.catre = trare[i].b;
x.cost = trare[i].val;
g[trare[i].a].push_back(x);
x.catre = trare[i].a;
g[trare[i].b].push_back(x);
}
}
/*
//printf("wowow\n");
for(int i = 0; i < m; i++) {
//printf(stdout, "%d %d\n", trare[i].a, trare[i].b);
}
//printf("wowow\n");
for(int j = 1; j <= n; j++) {
for(int i = 0; i < g[j].size(); i++) {
//printf("%d ", g[j][i].catre);
}
//printf("\n");
for(int i = 0; i < g[j].size(); i++) {
//printf("%d ", g[j][i].cost);
}
//printf("\n-----------------\n");
}
*/
int x = gase(1);
//printf("NEBUNU %d \n", x);
viz[x] = 1;
dfs(x, 1);
//printf("\n-------GATABOSS------\n");
for(int i = 2; i <= LOGBA; i++) {
for(int j = 1; j <= n; j++) {
tatici[i][j].catre = tatici[i - 1][tatici[i - 1][j].catre].catre;
tatici[i][j].cost = max(tatici[i - 1][tatici[i - 1][j].catre].cost, tatici[i - 1][j].cost);
}
}
/*
for(int i = 0; i <= LOGBA; i++) {
for(int j = 1; j <= n; j++) {
printf("%d ", tatici[i][j].catre);
} printf("\n");
}
*/
for(int i = 0; i < k; i++) {
int a, b, deafis = 0;
fscanf(in, "%d%d", &a, &b);
if(viz[b] > viz[a]) {
int aux = a;
a = b;
b = aux;
}
//printf("--------%d %d\n", a, b);
while(viz[a] > viz[b]) {
int j = 0;
while(viz[tatici[j][a].catre] >= viz[b]) {
j++;
}
j--;
deafis = max(deafis, tatici[j][a].cost);
a = tatici[j][a].catre;
}
while(a != b) {
int j = LOGBA;
while(tatici[j][a].catre == tatici[j][b].catre) {
j--;
}
j++;
deafis = max(deafis, tatici[j][a].cost);
deafis = max(deafis, tatici[j][b].cost);
a = tatici[j][a].catre;
b = tatici[j][b].catre;
}
fprintf(out, "%d\n", deafis);
}
fclose(in);
fclose(out);
return 0;
}