#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int maxn = (int)1e5 + 10;
const int INF = (int)1e9;
int who[maxn][2], T = 0;
int used[maxn], pp[maxn], order[maxn];
vector<int> g[maxn];
struct shoes {
  int c, s, id;
  shoes() : c(0), s(0), id(0) {}
  shoes(int c, int s, int id) : c(c), s(s), id(id) {}
  bool operator<(const shoes &r) const { return s < r.s; }
};
vector<shoes> s, p;
bool cmp(int a, int b) { return s[a].c > s[b].c; }
bool dfs(int v) {
  if (used[v] == T) return false;
  used[v] = T;
  for (__typeof((g[v]).begin()) it = (g[v]).begin(); it != (g[v]).end(); it++) {
    if (pp[*it] == -1 || dfs(pp[*it])) {
      pp[*it] = v;
      return true;
    }
  }
  return false;
}
int main() {
  int n;
  cin >> n;
  s.resize(n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &s[i].c, &s[i].s);
    s[i].id = i;
  }
  sort((s).begin(), (s).end());
  int m;
  cin >> m;
  p.resize(m);
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &p[i].c, &p[i].s);
    p[i].id = i;
  }
  sort((p).begin(), (p).end());
  memset(who, -1, sizeof(who));
  int ptr = 0;
  for (int i = 0; i < m; i++) {
    while (ptr < n && s[ptr].s < p[i].s) ptr++;
    if (ptr == n || s[ptr].s - p[i].s > 1) continue;
    if (s[ptr].s == p[i].s) {
      who[i][0] = ptr;
      if (ptr + 1 < n && s[ptr + 1].s - p[i].s == 1) {
        who[i][1] = ptr + 1;
      }
    } else {
      who[i][1] = ptr;
    }
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < 2; j++)
      if (who[i][j] != -1) {
        int id = who[i][j];
        if (p[i].c >= s[id].c) {
          g[id].push_back(i);
        }
      }
  }
  for (int i = 0; i < n; i++) {
    order[i] = i;
  }
  sort(order, order + n, cmp);
  long long res = 0;
  memset(pp, -1, sizeof(pp));
  for (int i = 0; i < n; i++) {
    ++T;
    if (dfs(order[i])) {
      res += s[order[i]].c;
    }
  }
  cout << res << endl;
  vector<pair<int, int> > ans;
  for (int i = 0; i < m; i++) {
    if (pp[i] != -1) {
      ans.push_back(make_pair(p[i].id, s[pp[i]].id));
    }
  }
  cout << (int)(ans).size() << endl;
  for (int i = 0; i < (int)(ans).size(); i++) {
    printf("%d %d\n", ans[i].first + 1, ans[i].second + 1);
  }
  return 0;
}
