#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int NMAX = 15005;
const int MMAX = 30005;
const int KMAX = 15005;
typedef pair<int,pair<int,int> > Edge1;
typedef pair<int,int> Edge2;
int N,M,K;
int root[NMAX];
int rang[NMAX];
int find(int x)
{
if(x!=root[x]) root[x]=find(root[x]);
return root[x];
}
void unite(int x,int y)
{
if(rang[x]>rang[y]) {root[y]=x; return;}
if(rang[x]<rang[y]) {root[x]=y; return;}
root[x]=y; rang[y]++;
}
vector<Edge1> V;
vector<Edge2> W[NMAX];
void APM()
{
vector<Edge1>::iterator it;
int i,a,b,c,x,y;
sort(V.begin(),V.end());
for(i=1;i<=N;i++)
{
root[i]=i;
rang[i]=1;
}
for(i=1,it=V.begin();i<=N-1 && it!=V.end();it++)
{
a=it->second.first;
b=it->second.second;
c=it->first;
x=find(a);
y=find(b);
if(x==y) continue;
unite(x,y);
W[a].push_back(make_pair(b,c));
W[b].push_back(make_pair(a,c));
i++;
}
}
int A[NMAX][15];
int B[NMAX][15];
int Nivel[NMAX];
void DFS(int x,int y)
{
vector<Edge2>::iterator it;
Nivel[x]=y;
for(it=W[x].begin();it!=W[x].end();it++)
{
if(Nivel[it->first]) continue;
A[it->first][0]=x;
B[it->first][0]=it->second;
DFS(it->first,y+1);
}
}
void precalc()
{
int i,j,p;
for(i=1,p=2;p<=N;i++,p<<=1)
for(j=1;j<=N;j++)
{
A[j][i]=A[A[j][i-1]][i-1];
if(A[j][i]) B[j][i]=max(B[j][i-1],B[A[j][i-1]][i-1]);
}
}
int query(int x,int y)
{
int i,p,P,a=0,b=0;
if(Nivel[x]>Nivel[y])
{
P=Nivel[x]-Nivel[y];
for(i=0,p=1;p<=P;i++,p<<=1)
if(P&p) {a=max(a,B[x][i]); x=A[x][i];}
}
if(Nivel[x]<Nivel[y])
{
P=Nivel[y]-Nivel[x];
for(i=0,p=1;p<=P;i++,p<<=1)
if(P&p) {b=max(b,B[y][i]); y=A[y][i];}
}
if(x!=y)
{
for(p=0,P=1;P<Nivel[x];p++,P<<=1);
for(i=p;i>=0;i--)
{
if(A[x][i] == A[y][i]) continue;
a=max(a,B[x][i]);
x=A[x][i];
b=max(b,B[y][i]);
y=A[y][i];
}
}
return max(a,b);
}
int main()
{
int a,b,c;
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d%d%d",&N,&M,&K);
for(;M;--M)
{
scanf("%d%d%d",&a,&b,&c);
V.push_back(make_pair(c,make_pair(a,b)));
}
APM();
DFS(1,1);
precalc();
for(;K;--K)
{
scanf("%d%d",&a,&b);
printf("%d\n",query(a,b));
}
return 0;
}