#include #include #include using namespace std; int n, m, k; struct vraboten { int plata, br_predmeti; vector predmet; }; int dp[202][1 << 8][1 << 8]; vraboten vraboteni[100], kandidati[220]; int rec(int at, int p1, int p2) { if(__builtin_popcount(p1) == n and __builtin_popcount(p2) == n) { return 0; } if(at == k) { return 1e9; } if(dp[at][p1][p2] != -1) { return dp[at][p1][p2]; } int result = 1e9; int t1 = p1, t2 = p2; for(int i = 0; i < kandidati[at].br_predmeti; i++) { int x = kandidati[at].predmet[i]; if(t1 & (1 << x)) { t2 |= (1 << x); } else { t1 |= (1 << x); } } result = min(result, rec(at + 1, t1, t2) + kandidati[at].plata); result = min(result, rec(at + 1, p1, p2)); return dp[at][p1][p2] = result; } int main() { cin >> n >> m; int p1 = 0, p2 = 0; int suma_plata = 0; for(int i = 0; i < m; i++) { cin >> vraboteni[i].plata >> vraboteni[i].br_predmeti; suma_plata += vraboteni[i].plata; for(int j = 0; j < vraboteni[i].br_predmeti; j++) { int x; cin >> x; x--; vraboteni[i].predmet.push_back(x); if(p1 & (1 << x)) { p2 |= (1 << x); } else { p1 |= (1 << x); } } } cin >> k; for(int i = 0; i < k; i++) { cin >> kandidati[i].plata >> kandidati[i].br_predmeti; for(int j = 0; j < kandidati[i].br_predmeti; j++) { int x; cin >> x; x--; kandidati[i].predmet.push_back(x); } } memset(dp, -1, sizeof dp); cout << rec(0, p1, p2) + suma_plata << endl; return 0; }