#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <bitset>
#include <cmath>
#define N 15005
using namespace std;
int n,m,k,x,y,c;
vector <pair<int,int>> g[N];
vector <pair<int,pair<int,int>>> muchi;
int dp[20][2*N],f[N];
int t[N], ad[N];
pair<int,int> vt[N];
bitset<N> viz;
int sol;
int cauttata(int nod){
if(t[nod]==0)
return nod;
t[nod] = cauttata(t[nod]);
return t[nod];
}
void dfs(int nod, int niv){
ad[nod] = niv;
dp[0][++dp[0][0]] = nod;
f[nod] = dp[0][0];
viz[nod]=1;
for(auto i : g[nod]){
if(!viz[i.first]){
vt[i.first] = {nod,i.second};
dfs(i.first,niv+1);
dp[0][++dp[0][0]] = nod;
}
}
}
void solveLCA(){
for(int i = 1; (1<<i)<=dp[0][0]; ++i)
for(int j = 1; j+(1<<(i-1))<dp[0][0]; ++j)
if(ad[dp[i-1][j]]<ad[dp[i-1][j+(1<<(i-1))]])
dp[i][j] = dp[i-1][j];
else
dp[i][j] = dp[i-1][j+(1<<(i-1))];
}
int lca(int st, int dr){
if(st>dr)
swap(st,dr);
int k2 = log2(dr-st+1);
if(ad[dp[k2][st]] < ad[dp[k2][dr-(1<<k2)+1]])
return dp[k2][st];
else
return dp[k2][dr-(1<<k2)+1];
}
void solve(int sursa, int dest){
if(sursa==dest)
return ;
sol = max(sol, vt[sursa].second);
solve(vt[sursa].first, dest);
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d%d%d", &n,&m,&k);
for(int i = 0; i < m; ++i){
scanf("%d%d%d", &x,&y,&c);
muchi.push_back({c,{x,y}});
}
sort(muchi.begin(),muchi.end());
int muc = 0;
for(pair<int,pair<int,int>> i : muchi){
int tx = cauttata(i.second.first), ty = cauttata(i.second.second);
if(tx!=ty){
t[tx] = ty;
g[i.second.first].push_back({i.second.second,i.first});
g[i.second.second].push_back({i.second.first,i.first});
++muc;
}
if(muc == n-1)
break;
}
dfs(1,0);
solveLCA();
for(int i = 0; i < k; ++i){
scanf("%d%d", &x,&y);
int s = lca(f[x],f[y]);
sol = 0;
solve(x,s);
solve(y,s);
cout<<sol<<"\n";
}
return 0;
}