#include <iostream>
#include<cstring>
#include<vector>
using namespace std;
// ja koristam taka dp nizata bidejki [200][1<<17] pagja na memorija
int dp[2][(1<<17)],cena[200];
vector<int> pred[200];
int main()
{
//dinamickoto mi e dp[do koj covek][maska]
// maskata mi oznacuva po koj predmet imame zemeno profesor
// bidejki ima 8 predmeti a treba po 2 profesori
// a bitovite se samo 0 i 1
// kje zemam 2^16 maska
// i pocnuvame so 000000000000000 maska, ako zemam profesor za prviot
// kje stane 100000000000000, ako zemam za 4tiot
// 100100000000000, ako zemam use eden za prviot kje go smenam i 9tiot bit(8+1)
// 100100001000000, taka mi raboti dinamickoto
memset(dp,-1,sizeof(dp));
long long ans=0;
int n,m,k,i,j,l,a,b,o=1;
cin>>n>>m;
int mask=0;
// bidejki imame dadeno deka profesori morat da rabotat
// gi stavame predmetite koj sto gi predavat vo pocetnata maska
// i parite gi stavame vo rezultat
for(i=0;i<m;i++)
{
cin>>j;
ans+=j;
cin>>l;
for(j=0;j<l;j++)
{
cin>>a;
a--;
if((mask&(1<<a))!=0) mask|=(1<<(n+a)); // ako ima vekje eden profesor go dodavame n+a-tiot bit
else mask|=(1<<a);// ako nema profesor za toj predmet obicno go menuvame bitot samo
}
}
cin>>k;
for(i=1;i<=k;i++)
{
cin>>cena[i];
cin>>l;
for(j=0;j<l;j++)
{
cin>>m;
pred[i].push_back(m-1);
}
}
dp[0][mask]=ans;
//
ans=999999999;
int now=1,prev; // bidejki gi menam redovite deka pagja na memorija gi iam deklarirano ovie
// za vrtenje na redovite
for(i=1;i<=k;i++) // gi izminuvam site profesori
{
prev=(now+1)%2; // mislam deka sfakjas kako odi shiftanjeto na redovite.. :D
for(j=0;j<(1<<(2*n));j++) // od 0 do 2^16, izminuvam za maskata
{
if(dp[prev][j]==-1) continue; // ako nemam od prethodniot red za taa maska ne dodavam
int mm=j;// inicijaliziram ja maskata na druga promenliva da ne zaebam
// ako sme stignale za taa maska (mm) gledame podobro resenie od prethodniot red
// i segasniot
if(dp[now][j]>=0) dp[now][j]=min(dp[now][j],dp[prev][j]);
// ako nema samo go stavame od prethodniot red
else dp[now][j]=dp[prev][j];
for(int z=0;z<pred[i].size();z++) // gi vrtime predmetite sto gi predava
{
// gi dodavam vo maskata predmetite
// ako e zafateno prviot bit,n+predmetot
// else prviot bit da go smene
if((mm&(1<<pred[i][z]))!=0) mm|=(1<<(n+pred[i][z]));
else mm|=(1<<pred[i][z]);
}
//ako sme stavile rezultat za maskata sto ja izgradivme
// go zimame podobriot rezultat
// else go stavame toj sto sme go dobile
if(dp[now][mm]>=0) dp[now][mm]=min(dp[now][mm],dp[prev][j]+cena[i]);
else dp[now][mm]=dp[prev][j]+cena[i];
}
now=(now+1)%2;
}
cout<<dp[(now+1)%2][(1<<(2*n))-1];
return 0;
}