#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const int INF = 1000 * 1000 * 1000 + 7;
const long long LINF = (long long)INF * INF;
const int MAX = 100 * 1000 + 7;
pair<pair<int, int>, int> shoes[MAX];
map<int, pair<int, int> > mx1, mx2;
long long dp[MAX][3];
bool take[MAX][3];
pair<int, int> par[MAX][3];
int who[MAX][3];
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, m;
  cin >> n;
  for (int i = (0); i < (n); ++i) {
    cin >> shoes[i].first.second >> shoes[i].first.first;
    shoes[i].second = i;
  }
  cin >> m;
  for (int i = (0); i < (m); ++i) {
    int d, l;
    cin >> d >> l;
    mx2[l] = max(mx2[l], make_pair(d, i));
    if (mx2[l] > mx1[l]) {
      swap(mx1[l], mx2[l]);
    }
  }
  sort(shoes, shoes + n);
  for (int i = (0); i < (n); ++i) {
    int c = shoes[i].first.second;
    int s = shoes[i].first.first;
    long long mx = 0;
    for (int j = (0); j < (3); ++j) {
      if (dp[i][j] > dp[i + 1][0]) {
        dp[i + 1][0] = dp[i][j];
        par[i + 1][0] = make_pair(i, j);
      }
      mx = max(mx, dp[i][j]);
    }
    for (int j = (0); j < (3); ++j) {
      if ((j != 1 || i == 0 || shoes[i - 1].first.first != s - 1) &&
          mx1[s - 1].first >= c && dp[i][j] + c > dp[i + 1][0]) {
        dp[i + 1][0] = dp[i][j] + c;
        take[i + 1][0] = true;
        par[i + 1][0] = make_pair(i, j);
        who[i + 1][0] = mx1[s - 1].second;
      }
      if ((j != 2 || i == 0 || shoes[i - 1].first.first != s - 1) &&
          mx2[s - 1].first >= c && dp[i][j] + c > dp[i + 1][0]) {
        dp[i + 1][0] = dp[i][j] + c;
        take[i + 1][0] = true;
        par[i + 1][0] = make_pair(i, j);
        who[i + 1][0] = mx2[s - 1].second;
      }
    }
    if (mx1[s].first >= c) {
      for (int j = (0); j < (3); ++j) {
        if (dp[i][j] + c > dp[i + 1][1]) {
          dp[i + 1][1] = dp[i][j] + c;
          take[i + 1][1] = true;
          par[i + 1][1] = make_pair(i, j);
          who[i + 1][1] = mx1[s].second;
        }
      }
    }
    if (mx2[s].first >= c) {
      for (int j = (0); j < (3); ++j) {
        if (dp[i][j] + c > dp[i + 1][2]) {
          dp[i + 1][2] = dp[i][j] + c;
          take[i + 1][2] = true;
          par[i + 1][2] = make_pair(i, j);
          who[i + 1][2] = mx2[s].second;
        }
      }
    }
  }
  long long ans = 0;
  pair<int, int> best = make_pair(n, 0);
  for (int j = (0); j < (3); ++j) {
    if (dp[n][j] > ans) {
      ans = dp[n][j];
      best = make_pair(n, j);
    }
  }
  vector<pair<int, int> > vec;
  while (best.first) {
    if (take[best.first][best.second]) {
      vec.push_back(make_pair(who[best.first][best.second],
                              shoes[best.first - 1].second));
    }
    best = par[best.first][best.second];
  }
  cout << ans << "\n";
  cout << (int)((vec).size()) << "\n";
  for (int i = (0); i < ((int)((vec).size())); ++i) {
    cout << vec[i].first + 1 << " " << vec[i].second + 1 << "\n";
  }
  return 0;
}
