#include<cstdio>
#include<cstdlib>
#include<vector>
#define min(a,b) (a)<(b)?(a):(b)
//#define max(a,b) (a)>(b)?(a):(b)
#define mp std::make_pair<int,int>
int n,m,k,i,r[100001],t[15001];
struct muchie{int x,y,c;};
muchie a[30001];
std::vector<std::pair<int,int> > b[15001];
int max(int a,int b)
{
if(a>b) return a;
return b;
}
int cmp(const void *a,const void *b)
{
muchie x,y;
x=*(muchie *)a;
y=*(muchie *)b;
return x.c-y.c;
}
inline int rad(int x)
{
if(x==t[x]) return x;
t[x]=rad(t[x]);
return t[x];
}
inline int uneste(int x,int y)
{
if(rad(x)!=rad(y))
{
if(r[t[x]]==r[t[y]])
r[t[x]]++,t[t[y]]=t[x];
else
if(r[t[x]]>r[t[y]])
t[t[y]]=t[x];
else
t[t[x]]=t[y];
return 1;
}
return 0;
}
inline void kruskal()
{
int left=n-1,i;
for(i=1;i<=n;i++)
t[i]=i,r[i]=0;
i=1;
while(left)
{
if(uneste(a[i].x,a[i].y))
{
b[a[i].x].push_back(mp(a[i].y,a[i].c));
b[a[i].y].push_back(mp(a[i].x,a[i].c));
left--;
}
i++;
}
}
int e[100001],ai[100001],nr;
void euler(int vf)
{
e[++nr]=vf;
t[vf]=nr;
for(int i=0;i<b[vf].size();i++)
if(!t[b[vf][i].first])
{
r[nr]=b[vf][i].second;
euler(b[vf][i].first);
r[nr]=b[vf][i].second;
e[++nr]=vf;
}
}
void buildcost(int poz,int st,int dr)
{
if(st==dr)
{
ai[poz]=0;
return;
}
int m=(st+dr)>>1,p=poz<<1;
buildcost(p,st,m);
buildcost(p+1,m+1,dr);
ai[poz]=max(ai[p],max(ai[p+1],r[m]));
}
int cost(int poz,int st,int dr,int x,int y)
{
if(x<=st && dr<=y) return ai[poz];
int m=(st+dr)>>1,p=poz<<1;
if(x<=m)
{
int a,b;
a=cost(p,st,m,x,y);
if(y>m)
{
b=cost(p+1,m+1,dr,x,y);
return max(a,max(r[m],b));
}
return a;
}
else
return cost(p+1,m+1,dr,x,y);
}
int Cost(int x,int y)
{
return cost(1,1,nr,min(t[x],t[y]),max(t[x],t[y]));
}
int main()
{
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[i].x,&a[i].y,&a[i].c);
qsort(a+1,m,sizeof(muchie),cmp);
kruskal();
memset(t,0,sizeof(t));
euler(1);
buildcost(1,1,nr);
int x,y;
for(i=1;i<=k;i++)
{
scanf("%d %d",&x,&y);
printf("%d\n",Cost(x,y));
}
fclose(stdout);
return 0;
}