#include <bits/stdc++.h>
using namespace std;
long long int c[200000], s[200000];
long long int d[200000], l[200000];
long long int dp[200000][4][4];
map<int, long long int> mp;
map<int, int> mp2;
vector<pair<int, int> > v;
long long int getans(int n, int last, int last2) {
  if (n == 0) return 0;
  long long int &ret =
      dp[n][min(2, last - v[n].first)][min(2, last2 - v[n].first)];
  if (ret == -1) {
    long long int ans1 = getans(n - 1, last, last2);
    long long int ans2 = 0;
    if (mp.count(v[n].first) > 0 && last != v[n].first && last2 != v[n].first)
      if (mp[v[n].first] <= v[n].second)
        ans2 = getans(n - 1, v[n].first, min(last, last2)) + mp[v[n].first];
    long long int ans3 = 0;
    if (mp.count(v[n].first + 1) > 0 && last != v[n].first + 1 &&
        last2 != v[n].first + 1)
      if (mp[v[n].first + 1] <= v[n].second)
        ans3 = getans(n - 1, v[n].first + 1, min(last, last2)) +
               mp[v[n].first + 1];
    ret = max(max(ans1, ans2), ans3);
  }
  return ret;
}
vector<pair<int, int> > fans;
int rev[200000];
long long int trace(int n, int last, int last2, long long int fret) {
  if (n == 0) return 0;
  if (n == 0) return 0;
  long long int &ret =
      dp[n][min(2, last - v[n].first)][min(2, last2 - v[n].first)];
  if (ret != -1) {
    long long int ans1 = getans(n - 1, last, last2);
    long long int ans2 = 0;
    if (mp.count(v[n].first) > 0 && last != v[n].first && last2 != v[n].first)
      if (mp[v[n].first] <= v[n].second)
        ans2 = getans(n - 1, v[n].first, min(last2, last)) + mp[v[n].first];
    long long int ans3 = 0;
    if (mp.count(v[n].first + 1) > 0 && last != v[n].first + 1 &&
        last2 != v[n].first + 1)
      if (mp[v[n].first + 1] <= v[n].second)
        ans3 = getans(n - 1, v[n].first + 1, min(last, last2)) +
               mp[v[n].first + 1];
    ret = max(max(ans1, ans2), ans3);
    if (fret == ans1)
      trace(n - 1, last, last2, fret);
    else if (fret == ans2) {
      if (mp.count(v[n].first) && mp[v[n].first] <= v[n].second) {
        fans.push_back(make_pair(rev[n], mp2[v[n].first]));
        trace(n - 1, v[n].first, min(last, last2), fret - mp[v[n].first]);
      }
    } else {
      fans.push_back(make_pair(rev[n], mp2[v[n].first + 1]));
      trace(n - 1, v[n].first + 1, min(last, last2), fret - mp[v[n].first + 1]);
    }
    ret = max(max(ans1, ans2), ans3);
  }
  return ret;
}
vector<pair<pair<int, int>, int> > vv;
int main() {
  int i, n, m;
  cin >> n;
  for (i = 0; i < n; i++) {
    cin >> c[i] >> s[i];
    mp[s[i]] = c[i];
    mp2[s[i]] = i + 1;
  }
  cin >> m;
  v.push_back(make_pair(-1, 0));
  for (i = 0; i < m; i++) {
    cin >> d[i] >> l[i];
    vv.push_back(make_pair(make_pair(l[i], d[i]), i + 1));
  }
  sort(vv.begin(), vv.end());
  for (i = 1; i <= m; i++) {
    v.push_back(vv[i - 1].first);
    rev[i] = vv[i - 1].second;
  }
  memset(dp, -1, sizeof(dp));
  long long int ans = getans(m, 1000000000 + 10, 1000000000 + 10);
  cout << ans << endl;
  trace(m, 1000000000 + 10, 1000000000 + 10, ans);
  cout << fans.size() << endl;
  for (i = 0; i < (int)fans.size(); i++)
    cout << fans[i].first << " " << fans[i].second << endl;
  return 0;
}
