N,M = map(int,input().split())
key = []
for i in range(M):
  a,b = map(int,input().split())
  C = list(map(int,input().split()))
  s = 0
  for i in range(b):
    C[i] -=1 #oindex
    s = s|1<<C[i] #それぞれの宝箱の番号で左シフトしてorをとることでどの宝箱を開けられるかを保存。
  key.append((s,a)) #開けられる宝箱とコストを保存
#print(key)
INF = float("inf")  
dp = [INF for _ in range(1<<N)]
dp[0] = 0
#配るDP O(2^N*M)
for s in range(1<<N): #小さい順からやるとうまく遷移ができる。
  for i in range(M): #すべてのカギについて遷移を試す。
    t = s|key[i][0] #現在の宝箱の状態sに対して、新しい鍵を加えたときに開けられる宝箱の状態。 
    dp[t] = min(dp[t],dp[s] + key[i][1])
#print(dp)
if dp[-1] == INF:
  ans = -1
else:
  ans = dp[-1]
print(ans) N,M = map(int,input().split()) N map(int,input().split()) map int input().split() ().split () input split M key = [] key [] for i in range(M):
  a,b = map(int,input().split())
  C = list(map(int,input().split()))
  s = 0
  for i in range(b):
    C[i] -=1 #oindex
    s = s|1<<C[i] #それぞれの宝箱の番号で左シフトしてorをとることでどの宝箱を開けられるかを保存。
  key.append((s,a)) #開けられる宝箱とコストを保存
#print(key) i range(M) range M a,b = map(int,input().split()) a map(int,input().split()) map int input().split() ().split () input split b C = list(map(int,input().split())) C list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split s = 0 s 0 for i in range(b):
    C[i] -=1 #oindex
    s = s|1<<C[i] #それぞれの宝箱の番号で左シフトしてorをとることでどの宝箱を開けられるかを保存。
   i range(b) range b C[i] -=1 C[i] C i 1 s = s|1<<C[i] s s|1<<C[i] s 1<<C[i] 1 C[i] C i key.append((s,a)) key.append key append (s,a) s a INF = float("inf") INF float("inf") float "inf" INF for _ in range(1<<N) for _ in range(1<<N) _ range(1<<N) range 1<<N 1 N for _ in range(1<<N) INF dp = [INF for _ in range(1<<N)] dp [INF for _ in range(1<<N)] dp[0] = 0 dp[0] dp 0 0 for s in range(1<<N): #小さい順からやるとうまく遷移ができる。
  for i in range(M): #すべてのカギについて遷移を試す。
    t = s|key[i][0] #現在の宝箱の状態sに対して、新しい鍵を加えたときに開けられる宝箱の状態。 
    dp[t] = min(dp[t],dp[s] + key[i][1])
#print(dp) s range(1<<N) range 1<<N 1 N for i in range(M): #すべてのカギについて遷移を試す。
    t = s|key[i][0] #現在の宝箱の状態sに対して、新しい鍵を加えたときに開けられる宝箱の状態。 
    dp[t] = min(dp[t],dp[s] + key[i][1])
#print(dp) i range(M) range M t = s|key[i][0] t s|key[i][0] s key[i][0] [i] key i 0 dp[t] = min(dp[t],dp[s] + key[i][1]) dp[t] dp t min(dp[t],dp[s] + key[i][1]) min dp[t] dp t dp[s] + key[i][1] dp[s] dp s key[i][1] [i] key i 1 if dp[-1] == INF:
  ans = -1
else:
  ans = dp[-1] dp[-1] == INF dp[-1] dp -1 INF ans = -1 ans -1 ans = dp[-1] ans dp[-1] dp -1 print(ans) print ans dp = [INF for _ in range(1<<N)] [INF for _ in range(1<<N)] dp M = map(int,input().split()) map(int,input().split()) M ans = dp[-1] dp[-1] ans a,b = map(int,input().split()) map(int,input().split()) a ans = -1 -1 ans INF = float("inf") float("inf") INF t = s|key[i][0] s|key[i][0] t N,M = map(int,input().split()) map(int,input().split()) N s = 0 0 s s = s|1<<C[i] s|1<<C[i] s key = [] [] key b = map(int,input().split()) map(int,input().split()) b C = list(map(int,input().split())) list(map(int,input().split())) C
N,M = map(int,input().split())
key = []
for i in range(M):
  a,b = map(int,input().split())
  C = list(map(int,input().split()))
  s = 0
  for i in range(b):
    C[i] -=1 #oindex
    s = s|1<<C[i] #それぞれの宝箱の番号で左シフトしてorをとることでどの宝箱を開けられるかを保存。
  key.append((s,a)) #開けられる宝箱とコストを保存
#print(key)
INF = float("inf")  
dp = [INF for _ in range(1<<N)]
dp[0] = 0
#配るDP O(2^N*M)
for s in range(1<<N): #小さい順からやるとうまく遷移ができる。
  for i in range(M): #すべてのカギについて遷移を試す。
    t = s|key[i][0] #現在の宝箱の状態sに対して、新しい鍵を加えたときに開けられる宝箱の状態。 
    dp[t] = min(dp[t],dp[s] + key[i][1])
#print(dp)
if dp[-1] == INF:
  ans = -1
else:
  ans = dp[-1]
print(ans)