import java.io.*;
import java.util.*;
public class tollroads_xiaowuc1 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    StringTokenizer st = new StringTokenizer(br.readLine());
    int n = Integer.parseInt(st.nextToken());
    int m = Integer.parseInt(st.nextToken());
    int numq = Integer.parseInt(st.nextToken());
    long[] edges = new long[m];
    int minw = (int)1e6;
    int maxw = 0;
    for(int i = 0; i < m; i++) {
      st = new StringTokenizer(br.readLine());
      long a = Integer.parseInt(st.nextToken());
      long b = Integer.parseInt(st.nextToken());
      long w = Integer.parseInt(st.nextToken());
      minw = Math.min(minw, (int)w);
      maxw = Math.max(maxw, (int)w);
      edges[i] = (w << 40) | (--a << 20) | (--b);
    }
    Arrays.sort(edges);
    int[] lq = new int[numq];
    int[] rq = new int[numq];
    int[] lbound = new int[numq]; Arrays.fill(lbound, minw);
    int[] rbound = new int[numq]; Arrays.fill(rbound, maxw);
    int[] lret = new int[numq];
    int[] rret = new int[numq];
    for(int i = 0; i < numq; i++) {
      st = new StringTokenizer(br.readLine());
      lq[i] = Integer.parseInt(st.nextToken())-1;
      rq[i] = Integer.parseInt(st.nextToken())-1;
    }
    DSU dsu = new DSU(n);
    long[] qord = new long[numq];
    while(true) {
      int nq = 0;
      for(int i = 0; i < numq; i++) {
        if(lbound[i] > rbound[i]) continue;
        long guess = (lbound[i] + rbound[i]) / 2;
        qord[nq++] = (guess << 20) | i;
      }
      if(nq == 0) break;
      Arrays.sort(qord, 0, nq);
      dsu.reset();
      int idx = 0;
      for(int i = 0; i < nq; i++) {
        int bound = (int)(qord[i] >> 20);
        while(idx < m && (edges[idx] >> 40) <= bound) {
          int a = (int)(edges[idx] & MASK);
          int b = (int)((edges[idx] >> 20) & MASK);
          dsu.merge(a, b);
          idx++;
        }
        int qi = (int)(qord[i] & MASK);
        if(dsu.find(lq[qi]) == dsu.find(rq[qi])) {
          lret[qi] = bound;
          rret[qi] = dsu.getSize(lq[qi]);
          rbound[qi] = bound - 1;
        }
        else {
          lbound[qi] = bound + 1;
        }
      }
    }
    for(int i = 0; i < numq; i++) {
      pw.print(lret[i]);
      pw.print(' ');
      pw.println(rret[i]);
    }
    pw.close();
  }

  static final int MASK = (1 << 20) - 1;

  static class DSU {
    private int[] p, sz;
    public DSU(int n) {
      p = new int[n]; sz = new int[n];
    }
    public void reset() {
      Arrays.fill(p, -1);
      Arrays.fill(sz, 1);
    }
    public int find(int x) {
      if(p[x] < 0) return x;
      return p[x] = find(p[x]);
    }
    public int getSize(int x) {
      return sz[find(x)];
    }
    public void merge(int a, int b) {
      a = find(a);
      b = find(b);
      if(a != b) {
        p[a] = b;
        sz[b] += sz[a];
      }
    }
  }

}