#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Vi = vector<int>;
using Pii = pair<int, int>;
int main() {
  cin.sync_with_stdio(0);
  cout << fixed << setprecision(15);
  map<int, Pii> shoes;
  map<int, vector<Pii>> customers;
  int n;
  cin >> n;
  for (int i = (0); i < (n); i++) {
    int c, s;
    cin >> c >> s;
    shoes[s] = {c, i};
  }
  int m;
  cin >> m;
  for (int i = (0); i < (m); i++) {
    int c, s;
    cin >> c >> s;
    customers[s].push_back({c, i});
  }
  Vi tmp;
  vector<Pii> chosen;
  ll profit = 0;
  auto sell = [&](int customer, int shoeSize) {
    chosen.push_back({customer, shoes[shoeSize].second});
    profit += shoes[shoeSize].first;
    shoes.erase(shoeSize);
  };
  for (auto& p : (customers)) {
    int size = p.first;
    auto& vec = p.second;
    sort((vec).begin(), (vec).end(),
         [&](Pii& l, Pii& r) { return l.first > r.first; });
    while (!vec.empty()) {
      int maxCost = vec.back().first, ind = vec.back().second;
      tmp.clear();
      for (int i = (size); i < (size + 2); i++) {
        if (shoes.count(i)) {
          if (shoes[i].first <= maxCost) tmp.push_back(i);
        }
      }
      if (int((tmp).size()) >= 2) break;
      if (!tmp.empty()) sell(ind, tmp[0]);
      vec.pop_back();
    }
    if (int((vec).size()) >= 2) {
      sell(vec[0].second, size);
      sell(vec[1].second, size + 1);
      vec.clear();
    }
  }
  queue<int> que;
  for (auto& p : (customers)) que.push(p.first);
  while (!que.empty()) {
    int size = que.front();
    auto& vec = customers[size];
    que.pop();
    if (vec.empty()) continue;
    int a = int(shoes.count(size)), b = int(shoes.count(size + 1));
    if (!a && !b) {
      vec.clear();
    } else if (!a) {
      sell(vec[0].second, size + 1);
      que.push(size + 1);
      vec.clear();
    } else if (!b) {
      sell(vec[0].second, size);
      que.push(size - 1);
      vec.clear();
    }
  }
  for (auto& p : (customers))
    if (!p.second.empty()) {
      int first = p.first, last = p.first + 1;
      int worst = min(shoes[first].first, shoes[last].first);
      while (customers.count(last) && !customers[last].empty()) {
        last++;
        worst = min(worst, shoes[last].first);
      }
      int i = first;
      for (; i <= last; i++) {
        if (shoes[i].first == worst) break;
        sell(customers[i][0].second, i);
        customers[i].clear();
      }
      for (i++; i <= last; i++) {
        sell(customers[i - 1][0].second, i);
        customers[i - 1].clear();
      }
    }
  cout << profit << '\n' << int((chosen).size()) << '\n';
  for (auto& p : (chosen)) cout << p.first + 1 << ' ' << p.second + 1 << '\n';
  return 0;
}
