#include <bits/stdc++.h>
using namespace std;
struct ntype {
  int c, s, n;
};
struct w1 {
  int u1, u2, b;
};
w1 P[100001][2][2];
bool funcsort(ntype a, ntype b) {
  if (a.s < b.s)
    return true;
  else
    return false;
}
int u, m, u1, u2, un1, un2, n, i, j, L, R, C;
ntype A[200000], B[200000];
long long dp[100001][2][2];
vector<pair<int, int> > res;
long long MAX(long long x, long long y) {
  if (x > y) y = x;
  return y;
}
int find(int x) {
  L = 0;
  R = n - 1;
  for (; L + 1 < R;) {
    C = (L + R) / 2;
    if (A[C].s > x)
      R = C;
    else
      L = C;
  }
  if (A[L].s == x || A[R].s == x)
    return 1;
  else
    return 0;
}
int numb(int x) {
  L = 0;
  R = n - 1;
  for (; L + 1 < R;) {
    C = (L + R) / 2;
    if (A[C].s > x)
      R = C;
    else
      L = C;
  }
  if (A[L].s == x)
    return L;
  else
    return R;
}
int main() {
  cin >> n;
  for (i = 0; i < n; ++i) scanf("%d%d", &A[i].c, &A[i].s);
  for (i = 0; i < n; ++i) A[i].n = i + 1;
  sort(A, A + n, funcsort);
  scanf("%d", &m);
  for (i = 0; i < m; ++i) {
    scanf("%d%d", &B[i].c, &B[i].s);
  }
  for (i = 0; i < m; ++i) {
    B[i].n = i + 1;
  }
  sort(B, B + m, funcsort);
  for (i = 0; i < m + 1; ++i)
    for (j = 0; j < 2; ++j)
      for (u = 0; u < 2; ++u) dp[i][j][u] = -1000000000000000000LL;
  u1 = find(B[0].s);
  u2 = find(B[0].s + 1);
  dp[0][u1][u2] = 0;
  int W;
  for (i = 0; i < m; ++i)
    for (u1 = 0; u1 < 2; ++u1)
      for (u2 = 0; u2 < 2; ++u2)
        if (dp[i][u1][u2] != -1000000000000000000LL) {
          if (i == m - 1) {
            un1 = 0;
            un2 = 0;
          } else {
            if (B[i].s == B[i + 1].s) {
              un1 = u1;
              un2 = u2;
            } else if (B[i].s + 1 == B[i + 1].s) {
              un1 = u2;
              un2 = find(B[i + 1].s + 1);
            } else {
              un1 = find(B[i + 1].s);
              un2 = find(B[i + 1].s + 1);
            }
          }
          dp[i + 1][un1][un2] = MAX(dp[i + 1][un1][un2], dp[i][u1][u2]);
          if (dp[i + 1][un1][un2] == dp[i][u1][u2]) {
            P[i + 1][un1][un2].u1 = u1;
            P[i + 1][un1][un2].u2 = u2;
            P[i + 1][un1][un2].b = 0;
          }
          if (u1 == 1) W = numb(B[i].s);
          if (u1 == 1 && B[i].c >= A[W].c) {
            if (i == m - 1) {
              un1 = 0;
              un2 = 0;
            } else {
              if (B[i].s == B[i + 1].s) {
                un1 = 0;
                un2 = u2;
              } else if (B[i].s + 1 == B[i + 1].s) {
                un1 = u2;
                un2 = find(B[i + 1].s + 1);
              } else {
                un1 = find(B[i + 1].s);
                un2 = find(B[i + 1].s + 1);
              }
            }
            dp[i + 1][un1][un2] =
                MAX(dp[i + 1][un1][un2], dp[i][u1][u2] + A[W].c);
            if (dp[i + 1][un1][un2] == dp[i][u1][u2] + A[W].c) {
              P[i + 1][un1][un2].u1 = u1;
              P[i + 1][un1][un2].u2 = u2;
              P[i + 1][un1][un2].b = A[W].n;
            }
          }
          if (u2 == 1) W = numb(B[i].s + 1);
          if (u2 == 1 && B[i].c >= A[W].c) {
            if (i == m - 1) {
              un1 = 0;
              un2 = 0;
            } else {
              if (B[i].s == B[i + 1].s) {
                un1 = u1;
                un2 = 0;
              } else if (B[i].s + 1 == B[i + 1].s) {
                un1 = 0;
                un2 = find(B[i + 1].s + 1);
              } else {
                un1 = find(B[i + 1].s);
                un2 = find(B[i + 1].s + 1);
              }
            }
            dp[i + 1][un1][un2] =
                MAX(dp[i + 1][un1][un2], dp[i][u1][u2] + A[W].c);
            if (dp[i + 1][un1][un2] == dp[i][u1][u2] + A[W].c) {
              P[i + 1][un1][un2].u1 = u1;
              P[i + 1][un1][un2].u2 = u2;
              P[i + 1][un1][un2].b = A[W].n;
            }
          }
        }
  long long answer = 0;
  for (u1 = 0; u1 < 2; ++u1)
    for (u2 = 0; u2 < 2; ++u2)
      if (dp[m][u1][u2] > answer) {
        answer = dp[m][u1][u2];
        un1 = u1;
        un2 = u2;
      }
  cout << answer << endl;
  while (m > 0) {
    u1 = P[m][un1][un2].u1;
    u2 = P[m][un1][un2].u2;
    if (P[m][un1][un2].b != 0) {
      res.push_back(make_pair(B[m - 1].n, P[m][un1][un2].b));
    }
    m--;
    un1 = u1;
    un2 = u2;
  }
  cout << res.size() << endl;
  for (i = 0; i < res.size(); ++i) {
    printf("%d %d\n", res[i].first, res[i].second);
  }
}
