#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <queue>
#define NMAX 15010
#define MMAX 30010
#define pb push_back
#define sz size()
#define ff first
#define ss second
#define MP make_pair
using namespace std;
int n, m, k;
pair<int, pair<int, int> > muc[MMAX];
vector< pair<int, int > > g[NMAX];
void read()
{
int i, a, b, c;
scanf("%d %d %d", &n, &m, &k);
for(i = 1; i <= m; ++i)
{
scanf("%d %d %d", &a, &b, &c);
muc[i] = MP(c, MP(a, b));
}
sort(muc+1, muc+m+1);
}
int t[NMAX];
int father(int x)
{
if(t[x] == x) return x;
x = father(t[x]);
return x;
}
int join(int a, int b)
{
if(a&1)
t[a] = b;
else
t[b] = a;
}
void apm()
{
for(int i = 1; i <= n; ++i) t[i] = i;
int nr = 0, a, b;
for(int i = 1; i <= m; ++i)
{
a = father(muc[i].ss.ff);
b = father(muc[i].ss.ss);
if(a == b) continue;
//printf("%d %d %d\n", muc[i].ss.ff, muc[i].ss.ss, muc[i].ff);
g[a].pb( MP(b, muc[i].ff) );
g[b].pb( MP(a, muc[i].ff) );
join(a, b);
++nr;
if(nr == n-1) break;
}
}
inline int MAX(int a, int b)
{
if(a > b) return a;
return b;
}
short uz[NMAX];
int bf(int a, int b)
{
queue< pair<int, int> > q;
vector< pair<int, int> > :: iterator it;
q.push( MP(a, 0) );
memset(uz, 0, sizeof(uz));
uz[a] = 1;
int c, x;
while(!q.empty())
{
x = (q.front()).ff;
c = (q.front()).ss;
q.pop();
for(it = g[x].begin(); it != g[x].end(); ++it)
{
if(!uz[ (*it).ff ])
{
c = MAX(c, (*it).ss);
q.push( MP((*it).ff, c) );
if((*it).ff == b)
return c;
++uz[ (*it).ff ];
}
}
}
return 0;
}
int main()
{
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
read();
apm();
int a, b;
for(int i = 1; i <= k; ++i)
{
scanf("%d %d", &a, &b);
printf("%d\n", bf(a, b));
}
return 0;
}