#include <bits/stdc++.h>
#define N 15100
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie2.out");
struct edge{
int x, y, c;
};
int n, m, k, x, y, xx, yy, c, vf, rs, stk[N], cost[N], dist[N], dad[N], anc[N][15], bst[N][15];
edge edges[2 * N];
vector <pair <int, int> > v[N];
bool viz[N];
bool cmp(edge a, edge b){
return a.c < b.c;
}
int find(int x){
return (dad[x] == x ? x : dad[x] = find(dad[x]));
}
void join(int x, int y){
dad[find(x)] = find(y);
}
void dfs(int tata, int nod, int lvl, int cst){
viz[nod] = 1;
dist[nod] = lvl;
cost[nod] = cst;
dad[nod] = tata;
for(auto son : v[nod])
if(!viz[son.first])
dfs(nod, son.first, lvl + 1, son.second);
}
void build(){
int sz = log2(n);
for(int i = 1; i <= n; i++)
anc[i][0] = i;
for(int j = 1; j <= sz; j++)
for(int i = 1; i <= n; i++){
x = anc[i][j - 1];
anc[i][j] = anc[dad[x]][j - 1];
bst[i][j] = max({bst[i][j - 1], bst[dad[x]][j - 1], cost[x]});
}
}
void solve(){
in >> x >> y;
rs = 0;
if(dist[x] < dist[y])
swap(x, y);
while(dist[x] > dist[y]){
int j = 1;
while(dist[anc[x][j]] >= dist[y])
rs = max(rs, bst[x][j]), x = anc[x][j], j++;
}
while(x != y){
int j = 1;
while(x != y && anc[x][j] != anc[y][j])
rs = max({rs, bst[x][j], bst[y][j]}), x = anc[x][j], y = anc[y][j], j++;
}
out << rs << '\n';
}
int main(){
in >> n >> m >> k;
for(int i = 1; i <= m; i++){
in >> x >> y >> c;
edges[i] = {x, y, c};
}
sort(edges + 1, edges + m + 1, cmp);
for(int i = 1; i <= n; i++)
dad[i] = i;
for(int i = 1; i <= m; i++){
x = edges[i].x;
y = edges[i].y;
c = edges[i].c;
xx = find(x);
yy = find(y);
if(xx != yy){
join(xx, yy);
v[x].push_back({y, c});
v[y].push_back({x, c});
}
}
for(int i = 1; i <= n; i++)
dad[i] = find(dad[i]);
for(int i = 1; i <= n; i++)
if(!viz[dad[i]]){
viz[dad[i]] = 1;
stk[++vf] = i;
}
memset(viz, 0, sizeof viz);
for(int i = 1; i < vf; i++){
v[i].push_back({i + 1, 0});
v[i + 1].push_back({i, 0});
}
vf = 0;
dfs(0, 1, 1, 0);
build();
while(k--)
solve();
return 0;
}