using namespace std;
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <string>
#include <bitset>
#include <algorithm>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <utility>
#include <functional>
#define pb push_back
#define c first
#define n second
#define f n.first
#define s n.second
#define sz size
#define II inline
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define mp make_pair
#define IN "radiatie.in"
#define OUT "radiatie.out"
#define oo 1<<30
#define N_MAX 1<<14
typedef pair<int,int> pi;
typedef vector<int> VI;
vector< pair<int,pi> > V;
int H[N_MAX],C[N_MAX],NR[N_MAX],T[N_MAX];
int R,N,M,K;
II void scan()
{
int x,y,cc;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d%d\n",&N,&M,&K);
FOR(i,1,M)
{
scanf("%d%d%d\n",&x,&y,&cc);
V.pb( mp(cc, mp(x,y) ) );
NR[x] = NR[y] = 1;
}
sort(V.begin(),V.end());
}
II int rep(int x)
{
return (!T[x]?x:rep(T[x]) );
}
II void add(int i,int x,int y)
{
if(NR[y] > NR[x])
NR[y] += NR[x],
C[x] = V[i].c,
T[x] = y;
else
NR[x] += NR[y],
C[y] = V[i].c,
T[y] = x;
}
II void make_tree()
{
int R1,R2;
FOR(i,0,M-1)
{
R1 = rep(V[i].f);
R2 = rep(V[i].s);
if(R1^R2)
add(i,R1,R2);
}
}
II int querry(int x,int y)
{
int rez(0);
if(H[y] > H[x])
swap(x,y);
for(;H[x] > H[y];rez = max(rez,C[x]),x = T[x]);
for(;x != y;rez = max(rez, max(C[y],C[x]) ),y = T[y],x = T[x]);
return rez;
}
II void solve()
{
R = rep(1);
FOR(i,1,N)
for(int j=i;j^R;++H[i],j=T[j]);
int x,y;
FOR(i,1,K)
scanf("%d %d\n",&x,&y),
printf("%d\n",querry(x,y) );
}
int main()
{
scan();
make_tree();
solve();
return 0;
}