#include<cstdio>
#include<cstdlib>
#include<vector>
#define max(a,b) (a)>(b)?(a):(b)
#define mp std::make_pair<int,int>
int n,m,K,i,r[15001],t[15001];
int cost[15001][20],T[15001][20];
struct muchie{int x,y,c;};
muchie a[30001];
std::vector<std::pair<int,int> > b[15001];
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++;
}
}
void df(int vf,int niv)
{
t[vf]=niv;
for(int i=0;i<b[vf].size();i++)
if(!t[b[vf][i].first])
{
T[b[vf][i].first][0]=vf;
cost[b[vf][i].first][0]=b[vf][i].second;
df(b[vf][i].first,niv+1);
}
}
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));
df(1,1);
int i,j,k;
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
{
T[j][i]=T[T[j][i-1]][i-1];
cost[j][i]=max(cost[j][i-1],cost[T[j][i-1]][i-1]);
}
k=i-1;
int x,y,maxim;
for(i=1;i<=K;i++)
{
scanf("%d %d",&x,&y);
maxim=0;
for(j=k;j>=0 && t[x]!=t[y];j--)
{
if(t[T[x][j]]>=t[y])
{
maxim=max(maxim,cost[x][j]);
x=T[x][j];
}
if(t[T[y][j]]>=t[x])
{
maxim=max(maxim,cost[y][j]);
y=T[y][j];
}
}
if(x!=y)
{
for(j=k;j>0;j--)
if(T[x][j]!=T[y][j])
{
maxim=max(maxim,max(cost[x][j],cost[y][j]));
x=T[x][j];
y=T[y][j];
}
for(j=0;j<=k;j++)
if(T[x][j]==T[y][j]) break;
maxim=max(maxim,max(cost[x][j],cost[y][j]));
}
printf("%d\n",maxim);
}
fclose(stdout);
return 0;
}