#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
#define Nmax 15010
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,m,k,ap[Nmax],l[Nmax],dp[20][Nmax],nr,pap[Nmax],val[Nmax];
struct ceva
{
int nod1,nod2,cost;
} v[Nmax];
vector <pair<int,int> > G[Nmax];
int cmp(ceva a,ceva b)
{
return a.cost<b.cost;
}
int stramos(int x)
{
if (ap[x]==x)
return ap[x];
ap[x]=stramos(ap[x]);
return ap[x];
}
void apm()
{
int i,j,nr1=0;
for (i=1; i<=m && nr1<n; i++)
{
int a=stramos(v[i].nod1),b=stramos(v[i].nod2);
if (a!=b)
{
nr1++;
G[v[i].nod1].push_back({v[i].nod2,v[i].cost});
G[v[i].nod2].push_back({v[i].nod1,v[i].cost});
if (l[a]<l[b])
{
l[b]+=l[a];
ap[a]=ap[b];
}
else
{
l[a]+=l[b];
ap[b]=ap[a];
}
}
}
}
void DFS(int start,int str)
{
l[start]=l[str]+1;
dp[0][++nr]=start;
if (!pap[start])
pap[start]=nr;
for (auto i:G[start])
{
if (str!=i.first)
{
DFS(i.first,start);
dp[0][++nr]=start;
}
}
}
void RMQ()
{
int o=2*n,x=0,i,j;
while ((1<<x)<o)
x++;
for (i=1; i<x; i++)
{
for (j=1; j<=o-(1<<i)+1; j++)
{
dp[i][j]=dp[i-1][j];
if (l[dp[i][j]]>l[dp[i-1][j+(1<<(i-1))]])
dp[i][j]=dp[i-1][j+(1<<(i-1))];
}
}
}
int parc(int start,int stramos)
{
queue <pair<int,int> > q;
q.push({start,0});
while (!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for (auto i:G[x])
{
if (l[i.first]<l[x])
{
y=max(y,i.second);
q.push({i.first,y});
if (i.first==stramos)
return y;
}
}
}
}
int main()
{
int i,a,b;
fin>>n>>m>>k;
for (i=1; i<=n; i++)
ap[i]=i,l[i]=1;
for (i=1; i<=m; i++)
fin>>v[i].nod1>>v[i].nod2>>v[i].cost;
sort (v+1,v+m+1,cmp);
apm();
memset(l,0,sizeof l);
l[0]=0;
DFS(1,0);
RMQ();
memset(ap,0,sizeof ap);
for (i=1;i<=k;i++)
{
fin>>a>>b;
int a1=min(pap[a],pap[b]),b1=max(pap[a],pap[b]);
int lung=b1-a1+1,x=0;
while ((1<<x)<=lung)
x++;
x--;
int min1=dp[x][a1];
if (l[min1]>l[dp[x][b1-(1<<x)+1]])
min1=dp[x][b1-(1<<x)+1];
fout<<max(parc(a,min1),parc(b,min1))<<"\n";
}
return 0;
}