#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct data {
  int c, sz, id;
  data(){};
  data(int _c, int _sz, int _id) {
    c = _c;
    sz = _sz;
    id = _id;
  }
} a[N], b[N];
int n, m, id = 0;
int dd[N], X[N];
long long cost[N];
vector<int> G[N];
void opf() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
void inp() {
  cin >> n;
  for (int(i) = (int)(1); (i) <= (int)(n); ++(i)) {
    cin >> a[i].c >> a[i].sz;
    a[i].id = i;
    cost[i] = a[i].c;
  }
  cin >> m;
  for (int(i) = (int)(1); (i) <= (int)(m); ++(i)) {
    cin >> b[i].c >> b[i].sz;
    b[i].id = i;
  }
}
inline bool cmpS(const data& a, const data& b) { return a.sz < b.sz; }
inline bool cmpC(const data& a, const data& b) { return a.c > b.c; }
bool dfs(int u) {
  if (dd[u] == id) return 0;
  dd[u] = id;
  for (int v : G[u])
    if (X[v] == -1 || dfs(X[v])) {
      X[v] = u;
      return 1;
    }
  return 0;
}
void solve() {
  sort(a + 1, a + n + 1, cmpS);
  for (int(i) = (int)(1); (i) <= (int)(m); ++(i)) {
    int cur =
        (int)(lower_bound(a + 1, a + n + 1, data(-1, b[i].sz, -1), cmpS) - a);
    while (a[cur].sz == b[i].sz || a[cur].sz == b[i].sz + 1) {
      if (a[cur].c <= b[i].c) G[a[cur].id].push_back(b[i].id);
      ++cur;
    }
  }
  sort(a + 1, a + n + 1, cmpC);
  memset((X), (-1), sizeof(X));
  for (int(i) = (int)(1); (i) <= (int)(n); ++(i)) ++id, dfs(a[i].id);
  long long res = 0ll;
  vector<pair<int, int> > ans;
  for (int(i) = (int)(1); (i) <= (int)(m); ++(i)) {
    if (X[i] == -1) continue;
    res += cost[X[i]];
    ans.push_back(make_pair(i, X[i]));
  }
  cout << res << '\n' << ans.size() << '\n';
  for (int(i) = (int)(0); (i) <= (int)(ans.size() - 1); ++(i))
    cout << ans[i].first << ' ' << ans[i].second << '\n';
}
int main() {
  opf();
  inp();
  solve();
  return 0;
}
