Buggy python submission (verdict: Time Limit Exceeded):
#ABC142-E Get Everything
"""
宝箱の制約が12個なので、これの状態を集合とする.
鍵をcost昇順に並べる。
ある鍵について、新たに埋められる場所が存在するなら、その鍵を使ってみる
"""
import sys
readline = sys.stdin.buffer.readline

n,m = map(int,readline().split())
INF = 10**10
cost_len_key = []
for i in range(m):
    a,b = map(int,readline().split())
    lst1 = list(map(int,readline().split()))
    res = 0
    for j in lst1:
        res += 1<<(j-1)
    cost_len_key.append([a,INF-b,res])

cost_len_key.sort()

#dp:状態s(か、s以上)の箱を開けた場合の最小コスト
dp = [INF for _ in range(1<<n)]

def rec(s,v,dp):
    if dp[s] < INF:
        return dp[s]
    if s == (1<<n) -1:
        return 0
    
    res = INF
    for u in range(v,m):
        if cost_len_key[u][2] & s != cost_len_key[u][2]: #sにはない場所が存在するなら
            res = min(res,rec(cost_len_key[u][2] | s,v+1,dp)
            +cost_len_key[u][0])
    dp[s] = res
    return res
res = rec(0,0,dp)
print(res if res < INF else -1)

Fixed submission:
#ABC142-E Get Everything
"""
宝箱の制約が12個なので、これの状態を集合とする.
鍵をcost昇順に並べる。
ある鍵について、新たに埋められる場所が存在するなら、その鍵を使ってみる
"""
import sys
readline = sys.stdin.buffer.readline

n,m = map(int,readline().split())
INF = 10**10
cost_len_key = []
for i in range(m):
    a,b = map(int,readline().split())
    lst1 = list(map(int,readline().split()))
    res = 0
    for j in lst1:
        res += 1<<(j-1)
    cost_len_key.append([a,INF-b,res])

cost_len_key.sort()

#dp:状態s(か、s以上)の箱を開けた場合の最小コスト
dp = [INF for _ in range(1<<n)]
dp[0] = 0

for i in range(1<<n):
    for j in cost_len_key:
        s = i|j[2]
        dp[s] = min(dp[s],dp[i]+j[0])

ans = dp[-1]
if ans < INF:
    print(ans)
else:
    print(-1)

Buggy python submission (verdict: Time Limit Exceeded):
#ABC142-E Get Everything
"""
宝箱の制約が12個なので、これの状態を集合とする.
鍵をcost昇順に並べる。
ある鍵について、新たに埋められる場所が存在するなら、その鍵を使ってみる
"""
import sys
readline = sys.stdin.buffer.readline

n,m = map(int,readline().split())
INF = 10**10
cost_len_key = []
for i in range(m):
    a,b = map(int,readline().split())
    lst1 = list(map(int,readline().split()))
    res = 0
    for j in lst1:
        res += 1<<(j-1)
    cost_len_key.append([a,INF-b,res])

cost_len_key.sort()

#dp:状態s(か、s以上)の箱を開けた場合の最小コスト
dp = [INF for _ in range(1<<n)]

def rec(s,v,dp):
    if dp[s] < INF:
        return dp[s]
    if s == (1<<n) -1:
        return 0
    
    res = INF
    for u in range(v,m):
        if cost_len_key[u][2] & s != cost_len_key[u][2]: #sにはない場所が存在するなら
            res = min(res,rec(cost_len_key[u][2] | s,v+1,dp)
            +cost_len_key[u][0])
    dp[s] = res
    return res
res = rec(0,0,dp)
print(res if res < INF else -1)

Fixed submission:
#ABC142-E Get Everything
"""
宝箱の制約が12個なので、これの状態を集合とする.
鍵をcost昇順に並べる。
ある鍵について、新たに埋められる場所が存在するなら、その鍵を使ってみる
"""
import sys
readline = sys.stdin.buffer.readline

n,m = map(int,readline().split())
INF = 10**10
cost_len_key = []
for i in range(m):
    a,b = map(int,readline().split())
    lst1 = list(map(int,readline().split()))
    res = 0
    for j in lst1:
        res += 1<<(j-1)
    cost_len_key.append([a,INF-b,res])

cost_len_key.sort()

#dp:状態s(か、s以上)の箱を開けた場合の最小コスト
dp = [INF for _ in range(1<<n)]
dp[0] = 0

for i in range(1<<n):
    for j in cost_len_key:
        s = i|j[2]
        dp[s] = min(dp[s],dp[i]+j[0])

ans = dp[-1]
if ans < INF:
    print(ans)
else:
    print(-1)