#include<fstream>
#include<set>
#include<vector>
#define Nmax 15001
#define INF 1000000000
#define pb push_back
using namespace std;
struct drum{int x, y;};
drum drumuri[Nmax];
vector< pair<int, int> > G[Nmax], A[Nmax];
set < pair<int, int> > cmin;
int d[Nmax], p[Nmax], i, viz[Nmax],n, m, k, solmax, Max;
int start, stop;
void read()
{
int a, b, c;
freopen("radiatie.in", "r", stdin);
freopen("radiatie.out", "w", stdout);
scanf("%d%d%d", &n , &m, &k);
for(i=1;i<=m;i++)
{
scanf("%d%d%d", &a, &b, &c);
G[a].pb(make_pair(b, c));
G[b].pb(make_pair(a, c));
}
for(i=1;i<=k;i++)
{
scanf("%d%d", &a, &b);
drumuri[i].x=a;
drumuri[i].y=b;
}
}
void init()
{
for(i=0;i<G[1].size();i++)
{
cmin.insert(make_pair(G[1][i].second, G[1][i].first));
d[G[1][i].first]=G[1][i].second;
p[G[1][i].first]=1;
}
for(i=1;i<=n;i++)
if(!d[i])
d[i]=INF;
viz[1]=1;
}
void APM()
{
int nrv=n-1, costmin, vfmin;
set< pair<int, int> >::iterator it;
while(nrv)
{
it=cmin.begin();
costmin=(*it).first;
vfmin=(*it).second;
viz[vfmin]=1;
nrv--;
cmin.erase(make_pair(costmin, vfmin));
for(i=0;i<G[vfmin].size();i++)
if(!viz[G[vfmin][i].first] && G[vfmin][i].second<d[G[vfmin][i].first])
{
cmin.erase(make_pair(d[G[vfmin][i].first], G[vfmin][i].first));
cmin.insert(make_pair(G[vfmin][i].second, G[vfmin][i].first));
d[G[vfmin][i].first]=G[vfmin][i].second;
p[G[vfmin][i].first]=vfmin;
}
}
}
void creatAPM()
{
for(i=2;i<=n;i++)
{
A[p[i]].pb(make_pair(i, d[i]));
A[i].pb(make_pair(p[i], d[i]));
}
}
int DFS(int k, int M)
{
int i, ca, t=0, Max;
for(i=0;i<A[k].size();i++)
{
if(!viz[A[k][i].first])
{
if(M<A[k][i].second)
{
Max=M;
M=A[k][i].second;
t=1;
}
viz[A[k][i].first]=1;
if(A[k][i].first==stop)
{
solmax=M;
return 0;
}
ca=A[k][i].first;
DFS(ca, M);
M=Max;
viz[A[k][i].first]=0;
}
}
}
void solve()
{
for(i=1;i<=n;i++)
viz[i]=0;
for(i=1;i<=k;i++)
{
start=drumuri[i].x;
stop=drumuri[i].y;
viz[start]=1;
DFS(start, 0);
viz[start]=viz[stop]=0;
printf("%d\n", solmax);
}
}
int main()
{
read();
init();
APM();
creatAPM();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}