#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct graf
{
int x,y,c;
};
graf gf[2*15005];
int n, m, k, T[15005], rang[15005], Cost[15005], Use[15005];
void Read()
{
f>>n>>m>>k;
for(int i = 1; i <= m; i++)
{
f>>gf[i].x>>gf[i].y>>gf[i].c;
}
}
inline bool Comp(graf a, graf b)
{
return a.c<b.c;
}
inline int caut(int a)
{
for(;T[a]!=a;a=T[a]);
return a;
}
inline void Unite(int a, int b, int c)
{
if(rang[a]<rang[b])
{
T[a] = b;
Cost[a] = c;
}
else
{
T[b] = a;
Cost[b] = c;
}
if(rang[a] == rang[b]) rang[a]++;
}
void arbmin()
{
for(int i = 1; i <= n; i++) T[i] = i;
sort(gf+1,gf+1+m,Comp);
for(int i = 1; i <= m; i++)
{
int a = caut(gf[i].x);
int b = caut(gf[i].y);
if(a!=b)
{
Unite(a, b, gf[i].c);
}
}
//for(int i = 1; i<=n; i++) cout<<T[i]<<' ';
}
inline int LCA(int a, int b, int p)
{
for(;T[a]!=a;Use[a] = p, a = T[a]);
for(;T[b]!=b && Use[b]!=p; b = T[b]);
return b;
}
inline int GetMax(int a, int b)
{
int cost = 0;
for(;a!=b;cost = max(cost,Cost[a]), a = T[a]);
return cost;
}
inline int Query(int a, int b, int p)
{
int l = LCA(a,b,p);
//cout<<l<<'\n';
return max(GetMax(a,l), GetMax(b,l));
}
void Solve()
{
arbmin();
while(k--)
{
int a, b;
f>>a>>b;
g<<Query(a,b,k)<<'\n';
}
}
int main()
{
Read();
Solve();
return 0;
}