#include<bits/stdc++.h>
using namespace std;
using ll=long long;
namespace IO {
template<class I>
inline void read(I &x) {
x = 0;
I f = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
x *= f;
}
template <typename T,typename ...Args>
inline void read(T &tmp,Args &...tmps) {
read(tmp);
read(tmps...);
}
template<class T>
inline void write(T x) {
if(x<0) {
putchar('-');
x=-x;
}
if(x>=10) {
write(x/10);
}
putchar(x%10+'0');
}
}
using namespace IO;
#define int long long
const int N=1e5+10;
struct customer{
int d,l,n;
}cus[N];
map<int,int> mp;
map<int,int> mp2;
int n,m,kmax;
map<int,vector<int>> cmp;
vector<pair<int,int>> vec;
bool visc[N],visp[N];
signed main() {
read(n);
for(int i=1;i<=n;i++) {
int ci,si;
read(ci,si);
mp[si]=ci;
mp2[si]=i;
}
read(m);
for(int i=1;i<=m;i++)
{
cus[i].n=i;
read(cus[i].d,cus[i].l);
cmp[cus[i].l].push_back(i);
cmp[cus[i].l+1].push_back(i);
}
typedef map<int,vector<int>>::iterator IT;
for(IT it=cmp.begin();it!=cmp.end();it++)
{
int pos=it->first;
sort(cmp[pos].begin(),cmp[pos].end(),greater<int>());
}
typedef map<int,int>::reverse_iterator It;
for(It it=mp.rbegin();it!=mp.rend();it++)
{
int key1=it->first;
int key2=it->second;
if(visc[key1]) continue;
for(auto x:cmp[key1])
{
if(!visp[x]&&cus[x].d>=key2)
{
kmax+=mp[key1];
vec.push_back(make_pair(x,mp2[key1]));
visp[x]=visc[key1]=true;
break;
}
}
}
cout<<kmax<<endl;
cout<<vec.size()<<endl;
for(auto x:vec) cout<<x.first<<" "<<x.second<<endl;
return 0;
}