N, M = map(int, input().split())

INF = float("inf")
# bitで表される状態を満たすための最小コスト
# ex. N=2
# [00]=1つも開かない, [01]=1だけ開く, [10]=2だけ開く, [11]=1,2の両方開く
dp = [INF] * (2**N)
# 1つも開かない状態はコスト0で実現される
dp[0] = 0

for i in range(1, M + 1):
    a, b = map(int, input().split())

    # ex.
    # c = [1] -> tmp = 01(2) = 1
    # c = [2] -> tmp = 10(2) = 2
    # c = [1,2] -> tmp = 11(2) = 3
    tmp = 0
    for c in list(map(int, input().split())):
        tmp += 1 << (c - 1)

    # target = ある状態(j)に対して、鍵(tmp)を使った後の状態
    # ex.
    # 状態00に鍵01を使う -> 結果は01(1が新しく開く)
    # 状態01に鍵01を使う -> 結果は01（変わらない）
    # 状態10に鍵01を使う -> 結果は11（１が新しく開く）
    # 状態11に鍵01を使う -> 結果は11（１が新しく開く）
    for j in range(2**N):
        # | = 論理和(OR)
        target = j | tmp
        # 状態jから鍵のコストaを支払ってtargetに遷移 or そのまま
        dp[target] = min(dp[j] + a, dp[target])

# 更新されていない場合、全て開けることは実現できない
if dp[2**N - 1] == INF:
    print(-1)
# 更新されている場合、全て開けることが可能
else:
    print(dp[2**N - 1]) N, M = map(int, input().split()) N map(int, input().split()) map int input().split() ().split () input split M INF = float("inf") INF float("inf") float "inf" dp = [INF] * (2**N) dp [INF] * (2**N) [INF] INF 2**N 2 N dp[0] = 0 dp[0] dp 0 0 for i in range(1, M + 1):
    a, b = map(int, input().split())

    # ex.
    # c = [1] -> tmp = 01(2) = 1
    # c = [2] -> tmp = 10(2) = 2
    # c = [1,2] -> tmp = 11(2) = 3
    tmp = 0
    for c in list(map(int, input().split())):
        tmp += 1 << (c - 1)

    # target = ある状態(j)に対して、鍵(tmp)を使った後の状態
    # ex.
    # 状態00に鍵01を使う -> 結果は01(1が新しく開く)
    # 状態01に鍵01を使う -> 結果は01（変わらない）
    # 状態10に鍵01を使う -> 結果は11（１が新しく開く）
    # 状態11に鍵01を使う -> 結果は11（１が新しく開く）
    for j in range(2**N):
        # | = 論理和(OR)
        target = j | tmp
        # 状態jから鍵のコストaを支払ってtargetに遷移 or そのまま
        dp[target] = min(dp[j] + a, dp[target])

# 更新されていない場合、全て開けることは実現できない i range(1, M + 1) range 1 M + 1 M 1 a, b = map(int, input().split()) a map(int, input().split()) map int input().split() ().split () input split b tmp = 0 tmp 0 for c in list(map(int, input().split())):
        tmp += 1 << (c - 1)

    # target = ある状態(j)に対して、鍵(tmp)を使った後の状態
    # ex.
    # 状態00に鍵01を使う -> 結果は01(1が新しく開く)
    # 状態01に鍵01を使う -> 結果は01（変わらない）
    # 状態10に鍵01を使う -> 結果は11（１が新しく開く）
    # 状態11に鍵01を使う -> 結果は11（１が新しく開く）
     c list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split tmp += 1 << (c - 1) tmp 1 << (c - 1) 1 c - 1 c 1 for j in range(2**N):
        # | = 論理和(OR)
        target = j | tmp
        # 状態jから鍵のコストaを支払ってtargetに遷移 or そのまま
        dp[target] = min(dp[j] + a, dp[target])

# 更新されていない場合、全て開けることは実現できない j range(2**N) range 2**N 2 N target = j | tmp target j | tmp j tmp dp[target] = min(dp[j] + a, dp[target]) dp[target] dp target min(dp[j] + a, dp[target]) min dp[j] + a dp[j] dp j a dp[target] dp target if dp[2**N - 1] == INF:
    print(-1)
# 更新されている場合、全て開けることが可能
else:
    print(dp[2**N - 1]) dp[2**N - 1] == INF dp[2**N - 1] dp 2**N - 1 2**N 2 N 1 INF print(-1) print -1 print(dp[2**N - 1]) print dp[2**N - 1] dp 2**N - 1 2**N 2 N 1 N, M = map(int, input().split()) map(int, input().split()) N dp = [INF] * (2**N) [INF] * (2**N) dp tmp += 1 << (c - 1) 1 << (c - 1) tmp INF = float("inf") float("inf") INF a, b = map(int, input().split()) map(int, input().split()) a b = map(int, input().split()) map(int, input().split()) b target = j | tmp j | tmp target M = map(int, input().split()) map(int, input().split()) M tmp = 0 0 tmp
N, M = map(int, input().split())

INF = float("inf")
# bitで表される状態を満たすための最小コスト
# ex. N=2
# [00]=1つも開かない, [01]=1だけ開く, [10]=2だけ開く, [11]=1,2の両方開く
dp = [INF] * (2**N)
# 1つも開かない状態はコスト0で実現される
dp[0] = 0

for i in range(1, M + 1):
    a, b = map(int, input().split())

    # ex.
    # c = [1] -> tmp = 01(2) = 1
    # c = [2] -> tmp = 10(2) = 2
    # c = [1,2] -> tmp = 11(2) = 3
    tmp = 0
    for c in list(map(int, input().split())):
        tmp += 1 << (c - 1)

    # target = ある状態(j)に対して、鍵(tmp)を使った後の状態
    # ex.
    # 状態00に鍵01を使う -> 結果は01(1が新しく開く)
    # 状態01に鍵01を使う -> 結果は01（変わらない）
    # 状態10に鍵01を使う -> 結果は11（１が新しく開く）
    # 状態11に鍵01を使う -> 結果は11（１が新しく開く）
    for j in range(2**N):
        # | = 論理和(OR)
        target = j | tmp
        # 状態jから鍵のコストaを支払ってtargetに遷移 or そのまま
        dp[target] = min(dp[j] + a, dp[target])

# 更新されていない場合、全て開けることは実現できない
if dp[2**N - 1] == INF:
    print(-1)
# 更新されている場合、全て開けることが可能
else:
    print(dp[2**N - 1])
