#include <bits/stdc++.h>
using namespace std;
struct Shoe {
  long long cost;
  int size;
  int nr;
  bool operator<(const Shoe& shoe) const { return size < shoe.size; }
};
struct Cust {
  long long money;
  int len;
  int nr;
  bool operator<(const Cust& cust) const {
    if (len == cust.len) {
      return money < cust.money;
    }
    return len < cust.len;
  }
};
int n, m;
vector<Shoe> shoes;
vector<Cust> custs;
long long dp[500000][3];
pair<int, int> prevv[500000][3];
int cust[500000][3];
void count_dp() {
  int j = 0, k = 0;
  for (int i = 1; i <= n; i++) {
    while (j + 1 < m && custs[j + 1].len + 1 <= shoes[i].size) {
      j++;
    }
    while (k + 1 < m && custs[k + 1].len <= shoes[i].size) {
      k++;
    }
    dp[i][0] = -1;
    for (int z = 0; z < 3; z++) {
      if (dp[i][0] < dp[i - 1][z]) {
        dp[i][0] = dp[i - 1][z];
        prevv[i][0] = {i - 1, z};
      }
    }
    dp[i][1] = -1;
    if (custs[k].len == shoes[i].size && custs[k].money >= shoes[i].cost) {
      dp[i][1] = dp[i][0] + shoes[i].cost;
      prevv[i][1] = prevv[i][0];
      cust[i][1] = k;
    }
    dp[i][2] = -1;
    if (custs[j].len + 1 == shoes[i].size && custs[j].money >= shoes[i].cost) {
      if (dp[i][2] < shoes[i].cost + dp[i - 1][0]) {
        dp[i][2] = shoes[i].cost + dp[i - 1][0];
        prevv[i][2] = {i - 1, 0};
        cust[i][2] = j;
      }
      if (dp[i][2] < shoes[i].cost + dp[i - 1][2]) {
        dp[i][2] = shoes[i].cost + dp[i - 1][2];
        prevv[i][2] = {i - 1, 2};
        cust[i][2] = j;
      }
      if (shoes[i].size != shoes[i - 1].size + 1) {
        if (dp[i][2] < shoes[i].cost + dp[i - 1][1]) {
          dp[i][2] = shoes[i].cost + dp[i - 1][1];
          prevv[i][2] = {i - 1, 1};
          cust[i][2] = j;
        }
      }
    }
    if (shoes[i].size == shoes[i - 1].size + 1) {
      if (j > 0 && custs[j].len + 1 == shoes[i].size &&
          custs[j - 1].len + 1 == shoes[i].size) {
        vector<int> V1;
        vector<int> V2;
        V1.push_back(shoes[i].cost);
        V1.push_back(shoes[i - 1].cost);
        V2.push_back(custs[j].money);
        V2.push_back(custs[j - 1].money);
        sort(V1.begin(), V1.end());
        sort(V2.begin(), V2.end());
        if (V1[0] <= V2[0] && V1[1] <= V2[1]) {
          if (dp[i][2] < shoes[i].cost + dp[i - 1][1]) {
            dp[i][2] = shoes[i].cost + dp[i - 1][1];
            prevv[i][2] = {i - 1, 1};
            cust[i][2] = j - 1;
          }
        }
      }
    }
  }
}
void solve() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int c, s;
    cin >> c >> s;
    shoes.push_back({c, s, i + 1});
  }
  cin >> m;
  for (int i = 0; i < m; i++) {
    int d, l;
    cin >> d >> l;
    custs.push_back({d, l, i + 1});
  }
  shoes.push_back({-1, -1, -1});
  sort(shoes.begin(), shoes.end());
  sort(custs.begin(), custs.end());
  count_dp();
  long long res = -1;
  int y = -1;
  for (int i = 0; i < 3; i++) {
    if (dp[n][i] > res) {
      res = dp[n][i];
      y = i;
    }
  }
  cout << res << "\n";
  stack<pair<int, int> > S;
  while (n != 0) {
    pair<int, int> tmp = {n, cust[n][y]};
    if (!S.empty() && shoes[S.top().first].cost > custs[S.top().second].money) {
      tmp.second = S.top().second;
      S.top().second = cust[n][y];
    }
    if (y != 0) {
      S.push(tmp);
    }
    pair<int, int> tmp2 = prevv[n][y];
    n = tmp2.first;
    y = tmp2.second;
  }
  cout << S.size() << "\n";
  while (!S.empty()) {
    cout << custs[S.top().second].nr << " " << shoes[S.top().first].nr << "\n";
    S.pop();
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(10);
  solve();
}
