#include <bits/stdc++.h>
using namespace std;
const int N=15005, M=30005, K=14;
tuple<int,int,int>edges[M];
vector<pair<int,int>>adj[N];
int sz[N], parent[N], p[N], height[N];
pair<int,int>bin[K][N], queries[N];
int getparent(int x){
if (parent[x]==x){
return x;
}
return parent[x]=getparent(parent[x]);
}
void unite(int a, int b){
a=getparent(a);
b=getparent(b);
if (sz[b]>sz[a]){
swap(a,b);
}
parent[b]=a;
sz[a]+=sz[b];
}
int lca(int a, int b){
int ans=0;
if (height[a]!=height[b]){
if (height[a]<height[b]){
swap(a,b);
}
int k=height[a]-height[b];
while (k){
int i=__builtin_ctz(k);
ans=max(ans, bin[i][a].second);
a=bin[i][a].first;
k&=(k-1);
}
}
if (a==b)return ans;
for (int i=K-1;i>=0;i--){
if (bin[i][a].first!=bin[i][b].first){
ans=max(ans, bin[i][a].second);
ans=max(ans, bin[i][b].second);
a=bin[i][a].first;
b=bin[i][b].first;
}
}
return max({ans, bin[0][a].second, bin[0][b].second});
}
void dfs(int i, int parentofi, int h){
height[i]=h;
for (auto [x,w]:adj[i])if (x!=parentofi){
bin[0][x]={i,w};
dfs(x,i,h+1);
}
}
int main()
{
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m,k;cin>>n>>m>>k;
for (int i=1;i<=n;i++){
sz[i]=1;
parent[i]=i;
}
for (int i=0;i<m;i++){
int u,v,w;cin>>u>>v>>w;
edges[i]={w,u,v};
}
sort(edges, edges+m);
for (int i=0;i<m;i++){
auto [w,u,v]=edges[i];
if (getparent(u)!=getparent(v)){
unite(u,v);
adj[u].push_back({v,w});
adj[v].push_back({u,w});
}
}
for (int idx=0;idx<k;idx++){
int a,b;cin>>a>>b;
if (idx==0){
dfs(a,0,0);
for (int i=1;i<K;i++){
for (int j=1;j<=n;j++){
bin[i][j].first=bin[i-1][bin[i-1][j].first].first;
bin[i][j].second=max(bin[i-1][j].second, bin[i-1][bin[i-1][j].first].second);
}
}
}
cout<<lca(a,b)<<'\n';
}
return 0;
}