#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:268435456")
using namespace std;
template <typename T1, typename T2>
istream& operator>>(istream& in, pair<T1, T2>& p) {
  in >> p.first >> p.second;
  return in;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& out, pair<T1, T2>& p) {
  out << p.first << ' ' << p.second;
  return out;
}
template <typename T>
istream& operator>>(istream& in, vector<T>& v) {
  for (int i = 0; i < int(v.size()); ++i) {
    in >> v[i];
  }
  return in;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T>& v) {
  for (int i = 0; i < int(v.size()); ++i) {
    out << v[i] << '\n';
  }
  return out;
}
struct ST {
  vector<int> t;
  int INF;
  int sz;
  ST() {}
  ST(int n) {
    t.assign(4 * n, n + 1);
    INF = n + 1;
    sz = n;
  }
  void set(int ll, int rr, int i, int pos, int val) {
    if (rr < pos || ll > pos) return;
    if (ll == pos && rr == pos) {
      t[i] = val;
      return;
    }
    int m = (ll + rr) / 2;
    set(ll, m, (i * 2 + 1), pos, val);
    set(m + 1, rr, (i * 2 + 2), pos, val);
    t[i] = min(t[(i * 2 + 1)], t[(i * 2 + 2)]);
  }
  int get(int l, int r, int ll, int rr, int i) {
    if (rr < l || ll > r) return INF;
    if (ll == l && rr == r) return t[i];
    int m = (ll + rr) / 2;
    return min(get(l, min(m, r), ll, m, (i * 2 + 1)),
               get(max(m + 1, l), r, m + 1, rr, (i * 2 + 2)));
  }
  void set(int pos, int val) { set(0, sz - 1, 0, pos, val); }
  int get(int l, int r) { return get(l, r, 0, sz - 1, 0); }
};
struct P {
  long long x;
  long long y;
  long long r;
};
bool cmp(P& a, P& b) { return a.r < b.r; }
struct Node {
  int was;
  vector<int> to;
};
vector<Node> g;
int bfs(int from, int to, int k) {
  g[from].was = k;
  queue<pair<int, int> > q;
  q.push(make_pair(from, 0));
  while (!q.empty()) {
    int v = q.front().first;
    int d = q.front().second;
    q.pop();
    for (int i = 0; i < int(g[v].to.size()); ++i) {
      int u = g[v].to[i];
      if (u == to) return d + 1;
      if (g[u].was == k) continue;
      g[u].was = k;
      q.push(make_pair(u, d + 1));
    }
  }
}
int get_dist(int u, int v, int k) {
  if (u == v) return 0;
  return bfs(u, v, k);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m, k;
  cin >> n >> m >> k;
  vector<P> points(n), circles(m);
  for (int i = 0; i < int(n); ++i) cin >> points[i].x >> points[i].y;
  for (int i = 0; i < int(m); ++i)
    cin >> circles[i].r >> circles[i].x >> circles[i].y;
  sort((circles).begin(), (circles).end(), cmp);
  g.resize(m + 1);
  for (int i = 0; i < int(m); ++i) {
    int u = m;
    for (int j = i + 1; j < m; ++j) {
      if (((circles[i].x - circles[j].x) * (circles[i].x - circles[j].x)) +
              ((circles[i].y - circles[j].y) * (circles[i].y - circles[j].y)) <
          ((circles[i].r - circles[j].r) * (circles[i].r - circles[j].r))) {
        u = j;
        break;
      }
    }
    g[i].to.push_back(u);
    g[u].to.push_back(i);
  }
  vector<int> nids(n);
  for (int i = 0; i < int(n); ++i) {
    int u = m;
    for (int j = 0; j < m; ++j) {
      if (((points[i].x - circles[j].x) * (points[i].x - circles[j].x)) +
              ((points[i].y - circles[j].y) * (points[i].y - circles[j].y)) <
          ((circles[j].r) * (circles[j].r))) {
        u = j;
        break;
      }
    }
    nids[i] = u;
  }
  for (int i = 0; i < int(k); ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    cout << get_dist(nids[a], nids[b], i + 1) << '\n';
  }
  return 0;
}
