#include <bits/stdc++.h>
using namespace std;
int n;
int m;
map<int, long long int> mp;
long long int dp[100002][2];
int pr[100002][2];
int sel[100002][2];
map<int, vector<int> > cnt;
map<int, vector<int> > cnt2;
vector<pair<int, int> > outt;
map<int, vector<int> > only;
map<int, int> mm;
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int c, s;
    scanf("%d%d", &c, &s);
    mp[s] = c;
    mm[s] = i + 1;
  }
  cin >> m;
  long long int ans = 0;
  for (int i = 0; i < m; i++) {
    int d, l;
    scanf("%d%d", &d, &l);
    bool ok1 = false;
    bool ok2 = false;
    if (mp.count(l) && mp[l] <= d) {
      ok1 = true;
    }
    if (mp.count(l + 1) && mp[l + 1] <= d) {
      ok2 = true;
    }
    if (ok1 == true && ok2 == false) {
      only[l].push_back(i + 1);
      continue;
    }
    if (ok2 == true && ok1 == false) {
      only[l + 1].push_back(i + 1);
      continue;
    }
    if (ok1 && ok2) {
      cnt[l].push_back(i + 1);
      cnt2[l + 1].push_back(i + 1);
    }
  }
  for (int i = 0; i < 100002; i++) {
    for (int j = 0; j < 2; j++) {
      dp[i][j] = LLONG_MIN;
    }
  }
  pr[0][0] = -114;
  dp[0][0] = 0;
  int idx = -1;
  for (auto it = mp.begin(); it != mp.end(); it++) {
    idx++;
    for (int j = 0; j < 2; j++) {
      if (dp[idx][j] == LLONG_MIN) continue;
      if (only[(*it).first].size()) {
        dp[idx + 1][0] = max(dp[idx + 1][0], dp[idx][j] + (*it).second);
        if (dp[idx + 1][0] == dp[idx][j] + (*it).second) {
          sel[idx + 1][0] = 3;
          pr[idx + 1][0] = j;
        }
        continue;
      }
      if ((int)(cnt2[(*it).first].size()) - j) {
        dp[idx + 1][0] = max(dp[idx + 1][0], dp[idx][j] + (*it).second);
        if (dp[idx + 1][0] == dp[idx][j] + (*it).second) {
          pr[idx + 1][0] = j;
          sel[idx + 1][0] = 0;
        }
      } else {
        if (cnt[(*it).first].size()) {
          dp[idx + 1][1] = max(dp[idx + 1][1], dp[idx][j] + (*it).second);
          if (dp[idx + 1][1] == dp[idx][j] + (*it).second) {
            pr[idx + 1][1] = j;
            sel[idx + 1][1] = 1;
          }
        }
        dp[idx + 1][0] = max(dp[idx + 1][0], dp[idx][j]);
        if (dp[idx + 1][0] == dp[idx][j]) {
          pr[idx + 1][0] = j;
          sel[idx + 1][0] = -1;
        }
      }
    }
  }
  ans += max(dp[idx + 1][0], dp[idx + 1][1]);
  int id = 0;
  if (dp[idx + 1][0] < dp[idx + 1][1]) {
    id = 1;
  }
  idx++;
  auto it = mp.rbegin();
  while (1) {
    int p = pr[idx][id];
    if (p == -114) {
      break;
    }
    auto pp = it;
    pp++;
    if (sel[idx][id] == 0) {
      outt.push_back(make_pair(cnt[(*pp).first].back(), (*it).first));
      cnt[(*pp).first].pop_back();
    }
    if (sel[idx][id] == 1) {
      outt.push_back(make_pair(cnt[(*it).first].back(), (*it).first));
    }
    if (sel[idx][id] == 3) {
      outt.push_back(make_pair(only[(*it).first].back(), (*it).first));
    }
    idx--;
    id = p;
    it++;
  }
  printf("%lld\n", ans);
  cout << outt.size() << endl;
  for (int i = 0; i < outt.size(); i++) {
    outt[i].second = mm[outt[i].second];
    printf("%d %d\n", outt[i].first, outt[i].second);
  }
  return 0;
}
