#include <bits/stdc++.h>
using namespace std;
struct shoe {
  int sz, cost, id;
  bool operator<(const shoe& o) const { return sz > o.sz; }
};
struct customer {
  int money, id;
  customer() {}
  customer(int money, int id) : money(money), id(id) {}
  bool operator<(const customer& o) const {
    if (money != o.money) return money < o.money;
    return id < o.id;
  }
};
int n, m;
vector<shoe> shoes;
map<int, vector<customer>> customers;
vector<pair<int, int>> p_ans;
vector<int> cust_sz;
map<pair<int, int>, long long> dp;
long long solve(int shoe_id, int last_cust) {
  if (shoe_id == n) return 0;
  int s_sz = shoes[shoe_id].sz;
  int s_cost = shoes[shoe_id].cost;
  if (last_cust != -1 && cust_sz[last_cust] != s_sz) last_cust = -1;
  pair<int, int> key = {shoe_id, last_cust};
  if (dp.count(key)) return dp[key];
  vector<customer>* c = &customers[s_sz];
  vector<customer>::iterator it =
      lower_bound(c->begin(), c->end(), customer(s_cost, -1));
  if (it != c->end()) {
    if (it->id != last_cust) {
      return dp[key] = s_cost + solve(shoe_id + 1, it->id);
    } else if (next(it) != c->end()) {
      ++it;
      return dp[key] = s_cost + solve(shoe_id + 1, it->id);
    }
  }
  long long ans = solve(shoe_id + 1, last_cust);
  c = &customers[s_sz - 1];
  it = lower_bound(c->begin(), c->end(), customer(s_cost, -1));
  if (it != c->end()) {
    ans = max(ans, s_cost + solve(shoe_id + 1, it->id));
  }
  return dp[key] = ans;
}
int t = 0;
void build_ans(int shoe_id, int last_cust) {
  if (shoe_id == n) return;
  int s_sz = shoes[shoe_id].sz;
  int s_cost = shoes[shoe_id].cost;
  int s_id = shoes[shoe_id].id;
  if (last_cust != -1 && cust_sz[last_cust] != s_sz) last_cust = -1;
  pair<int, int> key = {shoe_id, last_cust};
  vector<customer>* c = &customers[s_sz];
  vector<customer>::iterator it =
      lower_bound(c->begin(), c->end(), customer(s_cost, -1));
  if (it != c->end()) {
    if (it->id != last_cust) {
      p_ans.push_back({it->id, s_id});
      build_ans(shoe_id + 1, it->id);
      return;
    } else if (next(it) != c->end()) {
      ++it;
      p_ans.push_back({it->id, s_id});
      build_ans(shoe_id + 1, it->id);
      return;
    }
  }
  if (dp[key] == solve(shoe_id + 1, last_cust)) {
    build_ans(shoe_id + 1, last_cust);
    return;
  }
  c = &customers[s_sz - 1];
  it = lower_bound(c->begin(), c->end(), customer(s_cost, -1));
  if (it != c->end()) {
    p_ans.push_back({it->id, s_id});
    build_ans(shoe_id + 1, it->id);
    return;
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1, c, s; i <= n; ++i) {
    cin >> c >> s;
    shoes.push_back({s, c, i});
  }
  cin >> m;
  cust_sz.resize(m + 1);
  for (int i = 1, d, l; i <= m; ++i) {
    cin >> d >> l;
    customers[l].push_back({d, i});
    cust_sz[i] = l;
  }
  sort(shoes.begin(), shoes.end());
  for (auto& p : customers) sort(p.second.begin(), p.second.end());
  cout << solve(0, -1) << '\n';
  build_ans(0, -1);
  cout << p_ans.size() << '\n';
  for (pair<int, int> p : p_ans) {
    cout << p.first << ' ' << p.second << '\n';
  }
  return 0;
}
