#include <bits/stdc++.h>
using namespace std;
const int M = 1e5 + 5;
pair<int, int> a[M], b[M];
int arrk[M], arrm[M];
bool cmp(int x, int y) { return a[x].second < a[y].second; }
bool cmd(int x, int y) { return b[x].second < b[y].second; }
vector<pair<int, int> > getf;
int siz[M];
long long dp[4][M];
pair<int, int> par[4][M];
pair<int, int> kar[4][M];
long long solve(int lm, int rm, int lk, int rk) {
  if (rk - lk < 1) return 0;
  for (int i = lk; i < rk; i++)
    a[arrk[i]].second -= b[arrm[lm]].second, siz[a[arrk[i]].second] = arrk[i];
  for (int i = rm - 1; i >= lm; i--) b[arrm[i]].second -= b[arrm[lm]].second;
  for (int i = lm; i < rm; i++) {
    int p = arrm[i];
    int q = -1;
    if (i > lm) q = arrm[i - 1];
    int mysiz = b[p].second;
    int mypol = b[p].first;
    par[0][i + 1] = {0, i};
    kar[0][i + 1] = {-1, -1};
    dp[0][i + 1] = dp[0][i];
    if (~siz[mysiz] && mypol >= a[siz[mysiz]].first) {
      if (q == -1) {
        dp[0][i + 1] = a[siz[mysiz]].first;
        kar[0][i + 1] = {arrm[i], siz[mysiz]};
        par[0][i + 1] = {0, i};
      } else if (b[q].second == mysiz) {
        if (dp[1][i] + a[siz[mysiz]].first > dp[0][i + 1]) {
          dp[0][i + 1] = dp[1][i] + a[siz[mysiz]].first;
          kar[0][i + 1] = {arrm[i], siz[mysiz]};
          par[0][i + 1] = {1, i};
        }
      } else if (b[q].second == mysiz - 1) {
        if (dp[2][i] + a[siz[mysiz]].first > dp[0][i + 1]) {
          dp[0][i + 1] = dp[2][i] + a[siz[mysiz]].first;
          kar[0][i + 1] = {arrm[i], siz[mysiz]};
          par[0][i + 1] = {2, i};
        }
      }
    }
    if (~siz[mysiz + 1] && mypol >= a[siz[mysiz + 1]].first) {
      if (q == -1) {
        if (a[siz[mysiz + 1]].first > dp[0][i + 1]) {
          dp[0][i + 1] = a[siz[mysiz + 1]].first;
          kar[0][i + 1] = {arrm[i], siz[mysiz + 1]};
          par[0][i + 1] = {0, i};
        }
      } else if (b[q].second == mysiz) {
        if (dp[2][i] + a[siz[mysiz + 1]].first > dp[0][i + 1]) {
          dp[0][i + 1] = dp[2][i] + a[siz[mysiz + 1]].first;
          kar[0][i + 1] = {arrm[i], siz[mysiz + 1]};
          par[0][i + 1] = {2, i};
        }
      } else if (b[q].second == mysiz - 1) {
        if (dp[0][i] + a[siz[mysiz + 1]].first > dp[0][i + 1]) {
          dp[0][i + 1] = dp[0][i] + a[siz[mysiz + 1]].first;
          kar[0][i + 1] = {arrm[i], siz[mysiz + 1]};
          par[0][i + 1] = {0, i};
        }
      }
    }
    if (siz[mysiz] == -1)
      dp[1][i + 1] = -1;
    else {
      if (q == -1) {
        dp[1][i + 1] = 0;
        par[1][i + 1] = {0, i};
        kar[1][i + 1] = {-1, -1};
        if (~siz[mysiz + 1] && mypol >= a[siz[mysiz + 1]].first) {
          dp[1][i + 1] = a[siz[mysiz + 1]].first;
          kar[1][i + 1] = {arrm[i], siz[mysiz + 1]};
        }
      } else if (b[q].second == mysiz) {
        dp[1][i + 1] = dp[1][i];
        par[1][i + 1] = {1, i};
        kar[1][i + 1] = {-1, -1};
        if (~siz[mysiz + 1] && mypol >= a[siz[mysiz + 1]].first &&
            dp[3][i] + a[siz[mysiz + 1]].first > dp[1][i + 1]) {
          dp[1][i + 1] = dp[3][i] + a[siz[mysiz + 1]].first;
          par[1][i + 1] = {3, i};
          kar[1][i + 1] = {arrm[i], siz[mysiz + 1]};
        }
      } else if (b[q].second == mysiz - 1) {
        dp[1][i + 1] = dp[2][i];
        par[1][i + 1] = {2, i};
        kar[1][i + 1] = {-1, -1};
        if (~siz[mysiz + 1] && mypol >= a[siz[mysiz + 1]].first &&
            dp[2][i] + a[siz[mysiz + 1]].first > dp[1][i + 1]) {
          dp[1][i + 1] = dp[2][i] + a[siz[mysiz + 1]].first;
          par[1][i + 1] = {2, i};
          kar[1][i + 1] = {arrm[i], siz[mysiz + 1]};
        }
      }
    }
    if (siz[mysiz + 1] == -1)
      dp[2][i + 1] = -1;
    else {
      if (q == -1) {
        dp[2][i + 1] = 0;
        par[2][i + 1] = {0, i};
        kar[2][i + 1] = {-1, -1};
        if (~siz[mysiz] && mypol >= a[siz[mysiz]].first) {
          dp[2][i + 1] = a[siz[mysiz]].first;
          kar[2][i + 1] = {arrm[i], siz[mysiz]};
        }
      } else if (b[q].second == mysiz) {
        dp[2][i + 1] = dp[2][i];
        par[2][i + 1] = {2, i};
        kar[2][i + 1] = {-1, -1};
        if (~siz[mysiz] && mypol >= a[siz[mysiz]].first &&
            dp[3][i] + a[siz[mysiz]].first > dp[2][i + 1]) {
          dp[2][i + 1] = dp[3][i] + a[siz[mysiz]].first;
          par[2][i + 1] = {3, i};
          kar[2][i + 1] = {arrm[i], siz[mysiz]};
        }
      } else if (b[q].second == mysiz - 1) {
        dp[2][i + 1] = dp[0][i];
        par[2][i + 1] = {0, i};
        kar[2][i + 1] = {-1, -1};
        if (~siz[mysiz] && mypol >= a[siz[mysiz]].first &&
            dp[2][i] + a[siz[mysiz]].first > dp[2][i + 1]) {
          dp[2][i + 1] = dp[2][i] + a[siz[mysiz]].first;
          par[2][i + 1] = {2, i};
          kar[2][i + 1] = {arrm[i], siz[mysiz]};
        }
      }
    }
    if (siz[mysiz + 1] == -1 || siz[mysiz] == -1)
      dp[3][i + 1] = -1;
    else {
      if (q == -1) {
        dp[3][i + 1] = 0;
        par[3][i + 1] = {0, i};
        kar[3][i + 1] = {-1, -1};
      } else if (b[q].second == mysiz) {
        dp[3][i + 1] = dp[3][i];
        par[3][i + 1] = {3, i};
        kar[3][i + 1] = {-1, -1};
      } else if (b[q].second == mysiz - 1) {
        dp[3][i + 1] = dp[2][i];
        par[3][i + 1] = {2, i};
        kar[3][i + 1] = {-1, -1};
      }
    }
  }
  long long ret = dp[0][rm];
  int nx, x = 0;
  int ny, y = rm;
  while (y != lm) {
    if (kar[x][y].first != -1) getf.push_back(kar[x][y]);
    nx = par[x][y].first;
    ny = par[x][y].second;
    x = nx, y = ny;
  }
  for (int i = lm; i <= rm; i++)
    for (int j = 0; j < 3; j++) dp[j][i] = 0;
  for (int i = 0; i < rm - lm + 5; i++) siz[i] = -1;
  return ret;
}
int32_t main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) scanf("%d%d", &a[i].first, &a[i].second);
  iota(arrk, arrk + M, 0), sort(arrk, arrk + n, cmp);
  int m;
  cin >> m;
  for (int i = 0; i < m; i++) scanf("%d%d", &b[i].first, &b[i].second);
  iota(arrm, arrm + M, 0), sort(arrm, arrm + m, cmd);
  memset(siz, -1, sizeof siz);
  int ptr = 0;
  long long ans = 0;
  for (int i = 0; i < m; i++) {
    int go = i + 1;
    while (go < m && b[arrm[go]].second - b[arrm[go - 1]].second <= 1) go++;
    while (ptr < n && a[arrk[ptr]].second < b[arrm[i]].second) ptr++;
    int s = ptr;
    while (ptr < n && a[arrk[ptr]].second <= b[arrm[go - 1]].second + 1) ptr++;
    ans += solve(i, go, s, ptr);
    i = go - 1;
  }
  cout << ans << endl;
  cout << getf.size() << endl;
  for (pair<int, int> x : getf) printf("%d %d\n", x.first + 1, x.second + 1);
  return 0;
}
