#include <bits/stdc++.h>
using namespace std;
template <class T>
void clear(T &x) {
  T t;
  x.swap(t);
}
template <class T>
void miz(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
void maz(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
T gcd(T a, T b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
struct Shoe {
  int p, i;
  Shoe() {}
  Shoe(int p, int i) : p(p), i(i) {}
};
struct Customer {
  int m, f, i;
  bool operator<(const Customer &q) const { return f < q.f; }
};
const int CMAX = 100000;
map<int, Shoe> bst;
int C;
Customer cus[CMAX];
Shoe sa[CMAX], sb[CMAX];
long long dp[CMAX][2][2];
int pd[CMAX][2][2];
void MAZ(int i, int j, int k, long long v1, int v2) {
  if (v1 > dp[i][j][k]) {
    dp[i][j][k] = v1;
    pd[i][j][k] = v2;
  }
}
void solve() {
  int i, j, k;
  long long x;
  for (i = C - 1; i >= 0; i--) {
    for (j = 0; j < 2; j++) {
      for (k = 0; k < 2; k++) {
        if (i != C - 1) {
          if (cus[i + 1].f == cus[i].f) {
            dp[i][j][k] = dp[i + 1][j][k];
          } else if (cus[i + 1].f == cus[i].f + 1) {
            dp[i][j][k] = dp[i + 1][k][0];
          } else {
            dp[i][j][k] = dp[i + 1][0][0];
          }
        }
        if (!j && cus[i].m >= sa[i].p) {
          if (i == C - 1) {
            x = 0;
          } else if (cus[i + 1].f == cus[i].f) {
            x = dp[i + 1][1][k];
          } else if (cus[i + 1].f == cus[i].f + 1) {
            x = dp[i + 1][k][0];
          } else {
            x = dp[i + 1][0][0];
          }
          MAZ(i, j, k, sa[i].p + x, 1);
        }
        if (!k && cus[i].m >= sb[i].p) {
          if (i == C - 1) {
            x = 0;
          } else if (cus[i + 1].f == cus[i].f) {
            x = dp[i + 1][j][1];
          } else if (cus[i + 1].f == cus[i].f + 1) {
            x = dp[i + 1][1][0];
          } else {
            x = dp[i + 1][0][0];
          }
          MAZ(i, j, k, sb[i].p + x, 2);
        }
      }
    }
  }
  printf("%I64d\n", dp[0][0][0]);
  vector<pair<int, int> > ans;
  i = 0;
  j = 0;
  k = 0;
  while (1) {
    if (pd[i][j][k] == 0) {
      if (i == C - 1) {
        break;
      } else if (cus[i + 1].f == cus[i].f) {
        i++;
      } else if (cus[i + 1].f == cus[i].f + 1) {
        i++;
        j = k;
        k = 0;
      } else {
        i++;
        j = 0;
        k = 0;
      }
    } else if (pd[i][j][k] == 1) {
      ans.push_back(make_pair(cus[i].i, sa[i].i));
      if (i == C - 1) {
        break;
      } else if (cus[i + 1].f == cus[i].f) {
        i++;
        j = 1;
      } else if (cus[i + 1].f == cus[i].f + 1) {
        i++;
        j = k;
        k = 0;
      } else {
        i++;
        j = 0;
        k = 0;
      }
    } else if (pd[i][j][k] == 2) {
      ans.push_back(make_pair(cus[i].i, sb[i].i));
      if (i == C - 1) {
        break;
      } else if (cus[i + 1].f == cus[i].f) {
        i++;
        k = 1;
      } else if (cus[i + 1].f == cus[i].f + 1) {
        i++;
        j = 1;
        k = 0;
      } else {
        i++;
        j = 0;
        k = 0;
      }
    }
  }
  printf("%d\n", ans.size());
  for (i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
void GetShoe(int s, Shoe &shoe) {
  map<int, Shoe>::iterator it;
  it = bst.find(s);
  shoe = (it != bst.end() ? it->second : Shoe(INT_MAX, -1));
}
void input() {
  int S, i;
  scanf("%d", &S);
  for (i = 1; i <= S; i++) {
    int p, s;
    scanf("%d%d", &p, &s);
    bst.insert(make_pair(s, Shoe(p, i)));
  }
  scanf("%d", &C);
  for (i = 0; i < C; i++) {
    scanf("%d%d", &cus[i].m, &cus[i].f);
    cus[i].i = i + 1;
  }
  sort(cus, cus + C);
  for (i = 0; i < C; i++) {
    GetShoe(cus[i].f, sa[i]);
    GetShoe(cus[i].f + 1, sb[i]);
  }
}
int main() {
  input();
  solve();
  return 0;
}
