#include <cstdio>
using namespace std;
const char iname[] = "radiatie.in";
const char oname[] = "radiatie.out";
#define MAX_N 15001
#define MAX_M 30001
#define LG 20
int N,M,K;
int m[MAX_M][3];
int id[MAX_M];
int q[MAX_M][2];
int poz[MAX_N], val[MAX_N][LG], grup[MAX_N][LG];
int Numara[MAX_N], Primul[MAX_N], Ultimul[MAX_N], GRUP[MAX_N], LINK[MAX_N];
int X[MAX_M];
void read_in()
{
freopen(iname, "r", stdin);
int i;
scanf("%d %d %d",&N,&M,&K);
for (i = 1; i <= M; i++)
scanf("%d %d %d", &m[i][0], &m[i][1], &m[i][2]);
for (i = 1; i <= K; i++)
scanf("%d %d", &q[i][0], &q[i][1]);
}
void sort(int lo, int hi)
{
int i, j, k;
int mid = (hi + lo) / 2;
if (lo >= hi)
return;
sort(lo, mid);
sort(mid + 1, hi);
for(i = k = lo, j = mid + 1; i <= mid && j <= hi; k++)
if (m[id[i]][2] < m[id[j]][2])
X[k] = id[i ++];
else
X[k] = id[j ++];
for (; i <= mid; i++, k++) X[k] = id[i];
for (; j <= hi; j++, k++) X[k] = id[j];
for (i = lo; i <= hi; i++)
id[i] = X[i];
}
void connect(int x, int y, int v)
{
int p, grX, grY, aux;
grX = GRUP[x];
grY = GRUP[y];
if (grX == grY)
return;
if (Numara[grX] > Numara[grY])
aux = grX, grX = grY, grY = aux;
for (p = Primul[grX]; p; p = LINK[p]) {
GRUP[p] = grY;
poz[p]++;
val[p][ poz[p] ] = v;
grup[p][ poz[p] ] = grY;
}
Numara[grY] += Numara[grX];
Numara[grX] = 0;
LINK[ Ultimul[grY] ] = Primul[grX];
Ultimul[grY] = Ultimul[grX];
}
void solve()
{
int i;
for (i = 1; i <= M; i++)
id[i] = i;
sort(1, M);
for (i = 1; i <= N; i++) {
GRUP[i] = Primul[i] = Ultimul[i] = i;
LINK[i] = 0;
Numara[i] = 1;
poz[i] = 1;
val[i][1] = 0;
grup[i][1] = i;
}
for (i = 1; i <= M; i++)
connect(m[id[i]][0], m[id[i]][1], m[id[i]][2]);
}
int query(int x, int y)
{
int max, i, j;
for (i = poz[x], j = poz[y]; grup[x][i] == grup[y][j]; i--, j--)
;
i++;
j++;
max = val[x][i];
if (val[y][j] > max)
max = val[y][j];
return max;
}
int main()
{
read_in();
solve();
/* raspunde la intrebari */
freopen(oname, "w", stdout);
for(int i = 1; i <= K; i++)
printf("%d\n", query(q[i][0], q[i][1]));
return 0;
}