#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
#define N 1<<14
int f[101][N];
int n,m;
int T[50],D[50],tim[50];
struct node
{
int sta;
int val;
int tim1;
int minu;
}gru[50];
void init()
{
memset(f,0,sizeof(f));
memset(T,0,sizeof(T));
memset(tim,0,sizeof(tim));
memset(gru,0,sizeof(gru));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)return 0;
init();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&T[i],&D[i]);
tim[i]=T[i]/D[i];
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x;
gru[i].tim1=1<<30;
scanf("%d%d",&x,&gru[i].val);
for(int j=1;j<=x;j++)
{
int y;
scanf("%d",&y);
gru[i].val+=T[y];
gru[i].minu+=D[y];
gru[i].tim1=min(gru[i].tim1,tim[y]);
gru[i].sta=(gru[i].sta|(1<<(y-1)));
}
}
int ans=0;
for(int S=0;S<(1<<n);S++)
{
for(int i=1;i<=m;i++)
{
if(gru[i].sta&S)continue;
for(int j=gru[i].tim1;j>=0;j--)
{
f[j+1][S|gru[i].sta]=max(f[j][S]+gru[i].val-(j*gru[i].minu),f[j+1][S|gru[i].sta]);
ans=max(f[j+1][S|gru[i].sta],ans);
}
}
}
printf("%d\n",ans);
}
return 0;
}