#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(x,y) ( x < y ? y : x )
#define Nmax 15001
struct graf {
int vf;
long c; } *G[Nmax];
long *V[Nmax];
int n,m,k,niv,deg[Nmax];
void find( int nod )
{
int c[Nmax],pr,ul,i,elem,aux,kk;
niv ++ ;
V[niv]= ( long * ) calloc ( n +1, sizeof(long) );
for( i =1 ; i <= n ; i ++ ) V[niv][i]=0;
V[niv][0]=nod;
pr=ul=1;
c[pr]=nod;
memset( deg, 0 , (n+1)*sizeof(int) );
deg[nod]=1;
while ( pr <= ul )
{
elem=c[pr];
for( i = 1 ; i <= G[elem][0].vf; i ++ )
if( !deg[ G[elem][i].vf ] && ( V[niv][ G[elem][i].vf ] == 0 ||
V[niv][ G[elem][i].vf ] > max( V[niv][elem] , G[elem][i].c ) ) )
{
c[++ul]=G[elem][i].vf;
V[niv][c[ul]] = max( V[niv][elem] , G[elem][i].c );
kk=ul;
while( V[niv][c[kk]] < V[niv][c[kk-1]] || c[kk]==c[kk-1])
{
if( c[kk] != c[kk-1] )
{
aux=c[kk];
c[kk]=c[kk-1];
c[kk-1]=aux;
}
kk--;
}
}
deg[c[pr]]=1;
pr ++;
}
}
int main()
{
int i,x,y,kk;
long cost;
FILE *fin=fopen("radiatie.in","r");
FILE *fout=fopen("radiatie.out","w");
fscanf(fin,"%d%d%d",&n,&m,&k);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d %d %ld",&x, &y, &cost);
deg[x]++;
deg[y]++;
}
fclose(fin);
for ( i = 0; i <=n ;i ++ )
G[i]= ( graf * ) calloc ( (deg[i] +1), sizeof(graf) );
fin=fopen("radiatie.in","r");
fscanf(fin,"%d%d%d",&n,&m,&k);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%ld",&x,&y,&cost);
G[x][0].vf++;
G[x][ G[x][0].vf ].vf=y;
G[x][ G[x][0].vf ].c=cost;
G[y][0].vf++;
G[y][ G[y][0].vf ].vf=x;
G[y][ G[y][0].vf ].c=cost;
}
fscanf(fin,"%d%d",&x,&y);
find(x);
fprintf(fout,"%ld\n",V[1][y]);
for ( i = 2 ; i <= k ; i ++ )
{
fscanf(fin,"%d%d",&x,&y);
for ( kk =1 ;kk <= niv ; kk ++ )
if ( V[kk][x] != V[kk][y] )
{
fprintf(fout,"%ld\n", max(V[kk][x],V[kk][y]) );
break;
}
if( kk == niv+1)
{
find(x);
fprintf(fout,"%ld\n", V[kk][y] );
}
}
fclose(fin);
fclose(fout);
return 0;
}