#include <bits/stdc++.h>
using namespace std;
struct deal {
  long num_person;
  long num_shoue;
  vector<deal> *d;

 public:
  deal(long _p, long _s, vector<deal> *_d) {
    num_person = _p;
    num_shoue = _s;
    d = _d;
  }
  deal(long _p, long _s) {
    num_person = _p;
    num_shoue = _s;
    d = NULL;
  }
};
long n, m;
vector<vector<long long>> d1;
map<long, vector<long long>> people;
map<long, vector<long>> num_people;
map<long, long long> shoes;
map<long, long> num_shoes;
long long max(long long a, long long b) { return a > b ? a : b; }
int main() {
  scanf("%d", &n);
  shoes = map<long, long long>();
  num_shoes = map<long, long>();
  long size, money;
  for (long i = 0; i < n; i++) {
    scanf("%d%d", &money, &size);
    shoes[size] = money;
    num_shoes[size] = i;
  }
  scanf("%d", &m);
  people = map<long, vector<long long>>();
  for (long i = 0; i < m; i++) {
    scanf("%d%d", &money, &size);
    if (!people.count(size)) {
      people[size] = vector<long long>(2, 0);
      num_people[size] = vector<long>(2, -1);
    }
    if (people[size][0] < money) {
      people[size][1] = people[size][0];
      num_people[size][1] = num_people[size][0];
      people[size][0] = money;
      num_people[size][0] = i;
    } else if (people[size][1] < money) {
      people[size][1] = money;
      num_people[size][1] = i;
    }
  }
  map<long, vector<long long>>::iterator i = people.begin();
  long money2;
  size = -10;
  d1 = vector<vector<long long>>(m, vector<long long>(2, 0));
  long k = 0;
  vector<deal> *p10 = new vector<deal>();
  vector<deal> *p11 = new vector<deal>();
  vector<deal> *pp10;
  vector<deal> *pp11;
  long size10 = 0;
  long size11 = 0;
  long psize10;
  long psize11;
  long prev_size;
  for (i = people.begin(); i != people.end(); i++) {
    psize10 = size10;
    psize11 = size11;
    pp10 = p10;
    pp11 = p11;
    p10 = new vector<deal>();
    p10->reserve(3);
    p11 = new vector<deal>();
    p11->reserve(3);
    prev_size = size;
    size = i->first;
    money = i->second[0];
    money2 = i->second[1];
    if (prev_size + 1 < size) {
      p10->push_back(deal(-1, -1, pp11));
      p11->push_back(deal(-1, -1, pp11));
      size10 = psize11;
      size11 = psize11;
      if (shoes[size] > 0 && shoes[size] <= money) {
        d1[k][0] = shoes[size];
        p10->push_back(deal(num_people[size][0], num_shoes[size]));
        size10++;
      } else
        d1[k][0] = 0;
      d1[k][1] = 0;
      if (shoes[size] > 0 && shoes[size + 1] > 0) {
        long cost, cost2;
        bool p = 0;
        if (shoes[size] > shoes[size + 1]) {
          cost = shoes[size];
          cost2 = shoes[size + 1];
          p = 0;
        } else {
          cost = shoes[size + 1];
          cost2 = shoes[size];
          p = 1;
        }
        if (money >= cost) {
          d1[k][1] += cost;
          if (!p) {
            p11->push_back(deal(num_people[size][0], num_shoes[size]));
            size11++;
          } else {
            p11->push_back(deal(num_people[size][0], num_shoes[size + 1]));
            size11++;
          }
          if (money2 >= cost2) {
            d1[k][1] += cost2;
            if (!p) {
              p11->push_back(deal(num_people[size][1], num_shoes[size + 1]));
              size11++;
            } else {
              p11->push_back(deal(num_people[size][1], num_shoes[size]));
              size11++;
            }
          }
        } else {
          if (money >= cost2) {
            d1[k][1] += cost2;
            if (!p) {
              p11->push_back(deal(num_people[size][0], num_shoes[size + 1]));
              size11++;
            } else {
              p11->push_back(deal(num_people[size][0], num_shoes[size]));
              size11++;
            }
          }
        }
      } else {
        if (shoes[size] > 0 && shoes[size] <= money) {
          d1[k][1] = shoes[size];
          p11->push_back(deal(num_people[size][0], num_shoes[size]));
          size11++;
        }
        if (shoes[size + 1] > 0 && shoes[size + 1] <= money) {
          d1[k][1] = shoes[size + 1];
          p11->push_back(deal(num_people[size][0], num_shoes[size + 1]));
          size11++;
        }
      }
      if (k != 0) {
        d1[k][0] += d1[k - 1][1];
        d1[k][1] += d1[k - 1][1];
      }
    } else {
      long cost = 0;
      if (shoes[size] > 0 && shoes[size] <= money) cost = shoes[size];
      d1[k][0] = max(d1[k - 1][0] + cost, d1[k - 1][1]);
      if (d1[k - 1][0] + cost > d1[k - 1][1]) {
        p10->push_back(deal(-1, -1, pp10));
        if (cost) {
          p10->push_back(deal(num_people[size][0], num_shoes[size]));
          size10++;
        }
      } else {
        p10->push_back(deal(-1, -1, pp11));
      }
      cost = 0;
      long cost2 = 0;
      if (shoes[size] > 0 && shoes[size + 1] > 0) {
        if (shoes[size] > shoes[size + 1]) {
          if (shoes[size] <= money) {
            cost = shoes[size];
            if (shoes[size + 1] <= money2) cost2 = shoes[size + 1];
          } else {
            if (shoes[size + 1] <= money) {
              cost2 = shoes[size + 1];
            }
          }
        } else {
          if (shoes[size + 1] <= money) {
            cost2 = shoes[size + 1];
            if (shoes[size] <= money2) cost = shoes[size];
          } else {
            if (shoes[size] <= money) {
              cost = shoes[size];
            }
          }
        }
      } else {
        if (shoes[size] > 0 && shoes[size] <= money) cost = shoes[size];
        if (shoes[size + 1] > 0 && shoes[size + 1] <= money)
          cost2 = shoes[size + 1];
      }
      long cost3 = 0;
      if (shoes[size + 1] > 0 && shoes[size + 1] <= money)
        cost3 = shoes[size + 1];
      d1[k][1] = 0;
      d1[k][1] = max(d1[k - 1][0] + cost + cost2, d1[k - 1][1] + cost3);
      if (d1[k - 1][0] + cost + cost2 > d1[k - 1][1] + cost3) {
        p11->push_back(deal(-1, -1, pp10));
        if (cost != 0 && cost2 != 0) {
          if (cost > cost2) {
            p11->push_back(deal(num_people[size][0], num_shoes[size]));
            p11->push_back(deal(num_people[size][1], num_shoes[size + 1]));
            size11++;
            size11++;
          } else {
            p11->push_back(deal(num_people[size][0], num_shoes[size + 1]));
            p11->push_back(deal(num_people[size][1], num_shoes[size]));
            size11++;
            size11++;
          }
        } else {
          if (cost) {
            p11->push_back(deal(num_people[size][0], num_shoes[size]));
            size11++;
          }
          if (cost2) {
            p11->push_back(deal(num_people[size][0], num_shoes[size + 1]));
            size11++;
          }
        }
      } else {
        p11->push_back(deal(-1, -1, pp11));
        if (cost3) {
          p11->push_back(deal(num_people[size][0], num_shoes[size + 1]));
          size11++;
        }
      }
    }
    k++;
  }
  printf("%I64d\n", d1[k - 1][1]);
  printf("%d\n", size11);
  vector<deal> *p;
  p = p11;
  while ((*p).size() != 0) {
    for (int j = 1; j < (*p).size(); j++) {
      if ((*p)[j].num_person + 1 < 0) break;
      printf("%d %d\n", (*p)[j].num_person + 1, (*p)[j].num_shoue + 1);
    }
    p = (*p)[0].d;
  }
  return 0;
}
