#include <bits/stdc++.h>
int faster_in() {
  int r = 0, c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  if (c == '-') return -faster_in();
  for (; c > 32; r = (r << 1) + (r << 3) + c - '0', c = getchar())
    ;
  return r;
}
using namespace std;
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
const int INF = numeric_limits<int>::max() / 4;
vector<int> g[200010];
vector<int> mt;
vector<int> used;
int _time;
bool try_kuhn(int v) {
  if (used[v] == _time) return false;
  used[v] = _time;
  for (int to : g[v]) {
    if (mt[to] == -1 || try_kuhn(mt[to])) {
      mt[to] = v;
      return true;
    }
  }
  return false;
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<pair<pair<int, int>, int>> shoes(n);
  for (int i = (int)0, o_o = n; i < (int)o_o; ++i) {
    cin >> shoes[i].first.second >> shoes[i].first.first;
    shoes[i].second = i;
  }
  int m;
  cin >> m;
  vector<pair<pair<int, int>, int>> cli(m);
  int nodes = n + m + 2;
  sort((shoes).begin(), (shoes).end());
  auto getShoe = [&](int i) { return i; };
  auto getCli = [&](int i) { return n + i; };
  for (int i = (int)0, o_o = m; i < (int)o_o; ++i) {
    cin >> cli[i].first.first >> cli[i].first.second;
    cli[i].second = i;
    int iShoe = lower_bound((shoes).begin(), (shoes).end(),
                            make_pair(make_pair(cli[i].first.second, -1), -1)) -
                shoes.begin();
    if (iShoe >= 0 && iShoe < n &&
        shoes[iShoe].first.first == cli[i].first.second) {
      if (shoes[iShoe].first.second <= cli[i].first.first) {
        g[getShoe(iShoe)].push_back(getCli(i));
      }
    }
    if (iShoe >= 0 && iShoe < n &&
        shoes[iShoe].first.first == cli[i].first.second)
      iShoe++;
    if (iShoe >= 0 && iShoe < n &&
        shoes[iShoe].first.first == cli[i].first.second + 1) {
      if (shoes[iShoe].first.second <= cli[i].first.first) {
        g[getShoe(iShoe)].push_back(getCli(i));
      }
    }
  }
  long long res = 0;
  int flow = 0;
  vector<int> per(n);
  for (int i = (int)0, o_o = n; i < (int)o_o; ++i) {
    per[i] = i;
  }
  sort((per).begin(), (per).end(), [&](const int &a, const int &b) {
    return shoes[a].first.second > shoes[b].first.second;
  });
  _time = 0;
  mt.assign(nodes, -1);
  used.assign(nodes, -1);
  for (int _i = (int)0, o_o = n; _i < (int)o_o; ++_i) {
    _time++;
    int i = per[_i];
    if (try_kuhn(getShoe(i))) {
      flow++;
      res += 1LL * shoes[i].first.second;
    }
  }
  cout << res << '\n';
  cout << flow << '\n';
  for (int i = (int)0, o_o = m; i < (int)o_o; ++i) {
    if (mt[getCli(i)] != -1) {
      int c = i;
      int s = mt[getCli(i)];
      cout << cli[i].second + 1 << " " << shoes[s].second + 1 << '\n';
    }
  }
  return 0;
}
