#include <bits/stdc++.h>
#define pb push_back
#define x first
#define y second
#define MOD 1000000007
using namespace std;
typedef long long ll;
typedef pair< int , int > PII;
const int dirx[] = {-2,-1,1,2, 1, -1};
const int diry[] = {0,1,1,0, -1, -1};
int pozr;
char buffer[1010];
FILE *fi, *fo;
char getch(){
if( pozr == 1010 ){
fread( buffer, 1010, 1, fi );
pozr = 0;
}
return buffer[ pozr++ ];
}
void read(int &nr){
nr = 0;
char ch = getch();
while( isdigit(ch) == 0 )
ch = getch();
while( isdigit(ch) != 0 ){
nr = nr * 10 + ch - '0';
ch = getch();
}
}
int n, m, k, U[1 << 18], Lvl[1 << 18], F[1 << 18], RS[1 << 18];
vector < int > V[1 << 18];
unordered_map < int , int > M;
struct my{
int x, y, z;
} A[1 << 18];
void make_DFS(int x,int lvl){
Lvl[x] = lvl;
for (auto it : V[x])
make_DFS(it, lvl + 1);
}
int get_LCA(int x, int y){
int mx = 0;
if (Lvl[x] < Lvl[y]) swap(x, y);
while (Lvl[x] > Lvl[y]){
mx = max(mx, RS[x]);
x = U[x];
}
while (x != y){
mx = max({mx, RS[x], RS[y]});
x = U[x], y = U[y];
}
return mx;
}
int find(int x){ while (U[x]) x = U[x]; return x;}
void unite(int x, int y){ U[x] = y; }
int main(){
fi = fopen("radiatie.in", "r");
fo = fopen("radiatie.out", "w");
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
read(n), read(m), read(k);
for (int i = 1; i <= m; i++)
read(A[i].x), read(A[i].y), read(A[i].z);
sort(A + 1, A + m + 1, [&](my a, my b){return a.z < b.z;});
for (int i = 1; i <= m; i++){
int a = find(A[i].x), b = find(A[i].y);
if (a != b){
unite(a, b);
RS[a] = A[i].z;
V[b].pb(a);
}
}
int cnt = 1;
while (U[cnt++]);
make_DFS(cnt, Lvl[cnt]);
for (int i = 1, x, y; i <= k; i++){
read(x), read(y);
fprintf(fo, "%d\n", get_LCA(x, y));
}
return 0;
}