#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
map<int, vector<pair<int, int>>> mp;
vector<pair<int, int>> shoes;
long long memo[MAXN][4];
long long calcState(int ind, int mask) {
  if (memo[ind][mask] != -1) {
    return memo[ind][mask];
  }
  if (ind == shoes.size()) {
    return 0;
  }
  auto it = mp.find(shoes[ind].first);
  long long answer = calcState(ind + 1, 0);
  if (it != mp.end()) {
    bool mode = false;
    if (ind != shoes.size() - 1 &&
        shoes[ind].first + 1 == shoes[ind + 1].first) {
      mode = true;
    }
    for (int i = 0; i < it->second.size(); i++) {
      if (it->second[i].first < shoes[ind].second) continue;
      answer =
          max(answer, shoes[ind].second + calcState(ind + 1, (1 << i) * mode));
    }
  }
  it = mp.find(shoes[ind].first - 1);
  if (it != mp.end()) {
    for (int i = 0; i < it->second.size(); i++) {
      if (((mask >> i) & 1) == 1) continue;
      if (it->second[i].first < shoes[ind].second) continue;
      answer = max(answer, shoes[ind].second + calcState(ind + 1, 0));
    }
  }
  memo[ind][mask] = answer;
  return answer;
}
long long value;
vector<pair<int, int>> answer;
map<pair<int, int>, int> shoe2Index;
void recover(int ind, int mask) {
  if (ind == shoes.size()) {
    return;
  }
  auto it = mp.find(shoes[ind].first);
  if (0 + calcState(ind + 1, 0) == value) {
    value -= 0;
    recover(ind + 1, 0);
    return;
  }
  if (it != mp.end()) {
    bool mode = false;
    if (ind != shoes.size() - 1 &&
        shoes[ind].first + 1 == shoes[ind + 1].first) {
      mode = true;
    }
    for (int i = 0; i < it->second.size(); i++) {
      if (it->second[i].first < shoes[ind].second) continue;
      if (shoes[ind].second + calcState(ind + 1, (1 << i) * mode) == value) {
        answer.push_back({it->second[i].second, shoe2Index[shoes[ind]]});
        value -= shoes[ind].second;
        recover(ind + 1, (1 << i) * mode);
        return;
      }
    }
  }
  it = mp.find(shoes[ind].first - 1);
  if (it != mp.end()) {
    for (int i = 0; i < it->second.size(); i++) {
      if (((mask >> i) & 1) == 1) continue;
      if (it->second[i].first < shoes[ind].second) continue;
      if (shoes[ind].second + calcState(ind + 1, 0) == value) {
        answer.push_back({it->second[i].second, shoe2Index[shoes[ind]]});
        value -= shoes[ind].second;
        recover(ind + 1, 0);
        return;
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    int c, s;
    cin >> c >> s;
    shoes.push_back({s, c});
    shoe2Index[{s, c}] = i;
  }
  sort(shoes.begin(), shoes.end());
  int m;
  cin >> m;
  for (int i = 0; i < m; i++) {
    int d, l;
    cin >> d >> l;
    mp[l].push_back({d, i});
  }
  for (auto it = mp.begin(); it != mp.end(); it++) {
    sort(it->second.begin(), it->second.end(), greater<pair<int, int>>());
    while (it->second.size() > 2) it->second.pop_back();
  }
  memset(memo, -1, sizeof(memo));
  value = calcState(0, 0);
  recover(0, 0);
  cout << calcState(0, 0) << '\n';
  cout << answer.size() << '\n';
  for (pair<int, int> item : answer) {
    cout << item.first + 1 << " " << item.second + 1 << '\n';
  }
}
