#include <bits/stdc++.h>
#define x(i) edge1[i].x
#define y(i) edge1[i].y
#define z(i) edge1[i].z
#define to(i) edge2[i].to
#define val(i) edge2[i].val
#define next(i) edge2[i].next
using namespace std;
const int N = 2e4 + 1, M = 1e5 + 1;
struct Edge1{
int x;
int y;
int z;
}edge1[M];
struct Edge2{
int to;
int val;
int next;
}edge2[2 * N];
int tot, cnt, p1[N], head[N], d[N], lg[N], p2[N][15], minw[N][15];
bool cmp(Edge1 l, Edge1 r){
return l.z > r.z;
}
void init(int n){
tot = n;
for (int i = 1; i <= n; i++)
p1[i] = i;
cnt = 0;
memset(head + 1, 0, sizeof(int) * n);
memset(d + 1, -1, sizeof(int) * n);
for (int i = 2; i < n; i++)
lg[i] = lg[i >> 1] + 1;
}
int find(int x){
if (p1[x] == x) return x;
return p1[x] = find(p1[x]);
}
void merge(int x, int y){
p1[find(x)] = find(y);
}
void add_edge(int u, int v, int w){
to(++cnt) = v;
val(cnt) = w;
next(cnt) = head[u];
head[u] = cnt;
}
void kruskal(int m){
sort(edge1 + 1, edge1 + m + 1, cmp);
for (int i = 1; i <= m; i++){
if (find(x(i)) == find(y(i))) continue;
merge(x(i), y(i));
add_edge(x(i), y(i), z(i));
add_edge(y(i), x(i), z(i));
if (--tot == 1) break;
}
}
void BFS(){
queue<int> q;
d[1] = 0;
q.push(1);
while (!q.empty()){
int u = q.front();
q.pop();
for (int i = head[u]; i; i = next(i)){
int v = to(i), w = val(i);
if (d[v] != -1) continue;
d[v] = d[u] + 1;
p2[v][0] = u;
minw[v][0] = w;
for (int j = 1; j <= lg[d[v]]; j++){
p2[v][j] = p2[p2[v][j - 1]][j - 1];
minw[v][j] = min(minw[v][j - 1], minw[p2[v][j - 1]][j - 1]);
}
q.push(v);
}
}
}
int LCA(int a, int b){
if (d[a] < d[b]) swap(a, b);
int ans = INT_MAX;
while (d[a] != d[b]){
int i = lg[d[a] - d[b]];
ans = min(ans, minw[a][i]);
a = p2[a][i];
}
if (a == b) return ans;
for (int i = lg[d[a]]; i >= 0; i--){
if (p2[a][i] == p2[b][i]) continue;
ans = min(ans, min(minw[a][i], minw[b][i]));
a = p2[a][i], b = p2[b][i];
}
return min(ans, min(minw[a][0], minw[b][0]));
}
int main(){
int n, m, s;
while (scanf("%d%d%d", &n, &m, &s) != EOF){
for (int i = 1; i <= m; i++)
scanf("%d%d%d", &x(i), &y(i), &z(i));
init(n);
kruskal(m);
while (s--){
int l, h;
scanf("%d%d", &l, &h);
printf("%d\n", LCA(l, h));
}
}
return 0;
}