# n=int(input())

# a,b=map(int, input().split())

# c=list(map(int, input().split()))

# s=[list(map(int,list(input()))) for i in range(h)]  # 二次元配列入力　二次元マップみたいな入力のとき



# a=100

# b=0.987654321

# print('{0:06d}-{1:6f}'.format(a,b))  # 0埋めのときの出力

# 000100-0.987654



import numpy as np

import math

import copy



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





# 各スイッチがどの電球につながっているかの情報をビットで保持する配列

# 1番目のスイッチが2番目と3番目の電球につながっていた場合以下のようにいなる

# (1 << 1) | (1 << 2) = (110)b   ※ zero index

mask_list = [0 for _ in range(N)]



for i in range(M):

    switches = list(map(int, input().split()))



    # switchesの2番目以降の要素には、スイッチの番号が入っている

    for j in range(1, len(switches)):

        sw_num = (switches[j] - 1) # スイッチの番号をzero index で管理する

        sw_bit = 1 << i # つながっている電球を二進数で表す

        mask_list[sw_num] = mask_list[sw_num] | sw_bit



conds = list(map(int, input().split()))



conds_dec = 0



for i in range(len(conds)):

    conds_dec |= conds[i] << i



light_num = 0

for s in range(1 << N):

    t = 0

    for i in range(N):

        if s >> i & 1:

            t = t ^ mask_list[i]

    if t == conds_dec:

        light_num += 1





print(light_num)

# n=int(sys.stdin.readline())

# a,b=map(int, sys.stdin.readline().split())

# c=list(map(int, sys.stdin.readline().split()))

# s=[list(map(int,list(sys.stdin.readline()))) for i in range(h)]  # 二次元配列入力　二次元マップみたいな入力のとき



# a=100

# b=0.987654321

# print('{0:06d}-{1:6f}'.format(a,b))  # 0埋めのときの出力

# 000100-0.987654



import math

import sys



#sys.stdin = open("input.txt")

N, M=list(map(int, sys.stdin.readline().split()))



# 各スイッチがどの電球につながっているかの情報をビットで保持する配列

# 1番目のスイッチが2番目と3番目の電球につながっていた場合以下のようになる

# (1 << 1) | (1 << 2) = (110)b   ※ zero index

bulb_list = [0 for _ in range(N)]



for bulb_idx in range(M):

    switches = list(map(int, sys.stdin.readline().split()))

    bulb_bit = 1 << bulb_idx # つながっている電球を二進数で表す



    # switchesの2番目以降の要素には、スイッチの番号が入っている

    for sw in switches[1::]:

        sw_idx = (sw - 1) # スイッチの番号をzero indexに変換する

        bulb_list[sw_idx] = bulb_list[sw_idx] | bulb_bit



bulb_conds = list(map(int, sys.stdin.readline().split()))



bulb_cond = 0

for i, bc in enumerate(bulb_conds):

    bulb_cond |= bc << i



light_num = 0

# N = 3 の時

# 000, 001, 010, 011, 100, 101, 110, 111 の8パターンで、

# スイッチを押す全てのパターンを表現することが出来る

for bit_ptn in range(1 << N):

    t = 0 # tはbit_ptnが表すスイッチの組み合わせを全て押したときの電球の状態を表す(最初は全部消えている)

    for i in range(N):

        if bit_ptn >> i & 1:

            t = t ^ bulb_list[i]

    if t == bulb_cond:

        light_num += 1



print(light_num)

# n=int(input())
# a,b=map(int, input().split())
# c=list(map(int, input().split()))
# s=[list(map(int,list(input()))) for i in range(h)]  # 二次元配列入力　二次元マップみたいな入力のとき
# a=100
# b=0.987654321
# print('{0:06d}-{1:6f}'.format(a,b))  # 0埋めのときの出力
# 000100-0.987654
import numpy as np
import math
import copy

N, M = list(map(int, input().split()))
# 各スイッチがどの電球につながっているかの情報をビットで保持する配列
# 1番目のスイッチが2番目と3番目の電球につながっていた場合以下のようにいなる
# (1 << 1) | (1 << 2) = (110)b   ※ zero index
mask_list = [0 for _ in range(N)]
for i in range(M):
    switches = list(map(int, input().split()))
    # switchesの2番目以降の要素には、スイッチの番号が入っている
    for j in range(1, len(switches)):
        sw_num = switches[j] - 1  # スイッチの番号をzero index で管理する
        sw_bit = 1 << i  # つながっている電球を二進数で表す
        mask_list[sw_num] = mask_list[sw_num] | sw_bit
conds = list(map(int, input().split()))
conds_dec = 0
for i in range(len(conds)):
    conds_dec |= conds[i] << i
light_num = 0
for s in range(1 << N):
    t = 0
    for i in range(N):
        if s >> i & 1:
            t = t ^ mask_list[i]
    if t == conds_dec:
        light_num += 1
print(light_num)

# n=int(sys.stdin.readline())
# a,b=map(int, sys.stdin.readline().split())
# c=list(map(int, sys.stdin.readline().split()))
# s=[list(map(int,list(sys.stdin.readline()))) for i in range(h)]  # 二次元配列入力　二次元マップみたいな入力のとき
# a=100
# b=0.987654321
# print('{0:06d}-{1:6f}'.format(a,b))  # 0埋めのときの出力
# 000100-0.987654
import math
import sys

# sys.stdin = open("input.txt")
N, M = list(map(int, sys.stdin.readline().split()))
# 各スイッチがどの電球につながっているかの情報をビットで保持する配列
# 1番目のスイッチが2番目と3番目の電球につながっていた場合以下のようになる
# (1 << 1) | (1 << 2) = (110)b   ※ zero index
bulb_list = [0 for _ in range(N)]
for bulb_idx in range(M):
    switches = list(map(int, sys.stdin.readline().split()))
    bulb_bit = 1 << bulb_idx  # つながっている電球を二進数で表す
    # switchesの2番目以降の要素には、スイッチの番号が入っている
    for sw in switches[1::]:
        sw_idx = sw - 1  # スイッチの番号をzero indexに変換する
        bulb_list[sw_idx] = bulb_list[sw_idx] | bulb_bit
bulb_conds = list(map(int, sys.stdin.readline().split()))
bulb_cond = 0
for i, bc in enumerate(bulb_conds):
    bulb_cond |= bc << i
light_num = 0
# N = 3 の時
# 000, 001, 010, 011, 100, 101, 110, 111 の8パターンで、
# スイッチを押す全てのパターンを表現することが出来る
for bit_ptn in range(1 << N):
    t = 0  # tはbit_ptnが表すスイッチの組み合わせを全て押したときの電球の状態を表す(最初は全部消えている)
    for i in range(N):
        if bit_ptn >> i & 1:
            t = t ^ bulb_list[i]
    if t == bulb_cond:
        light_num += 1
print(light_num)

-# n=int(input()) -# a,b=map(int, input().split()) -# c=list(map(int, input().split())) -# s=[list(map(int,list(input()))) for i in range(h)]  # 二次元配列入力　二次元マップみたいな入力のとき +# n=int(sys.stdin.readline()) +# a,b=map(int, sys.stdin.readline().split()) +# c=list(map(int, sys.stdin.readline().split())) +# s=[list(map(int,list(sys.stdin.readline()))) for i in range(h)]  # 二次元配列入力　二次元マップみたいな入力のとき -import numpy as np -import copy +import sys -N, M = list(map(int, input().split())) +# sys.stdin = open("input.txt") +N, M = list(map(int, sys.stdin.readline().split())) -# 1番目のスイッチが2番目と3番目の電球につながっていた場合以下のようにいなる +# 1番目のスイッチが2番目と3番目の電球につながっていた場合以下のようになる -mask_list = [0 for _ in range(N)] -for i in range(M): -    switches = list(map(int, input().split())) +bulb_list = [0 for _ in range(N)] +for bulb_idx in range(M): +    switches = list(map(int, sys.stdin.readline().split())) +    bulb_bit = 1 << bulb_idx  # つながっている電球を二進数で表す -    for j in range(1, len(switches)): -        sw_num = switches[j] - 1  # スイッチの番号をzero index で管理する -        sw_bit = 1 << i  # つながっている電球を二進数で表す -        mask_list[sw_num] = mask_list[sw_num] | sw_bit -conds = list(map(int, input().split())) -conds_dec = 0 -for i in range(len(conds)): -    conds_dec |= conds[i] << i +    for sw in switches[1::]: +        sw_idx = sw - 1  # スイッチの番号をzero indexに変換する +        bulb_list[sw_idx] = bulb_list[sw_idx] | bulb_bit +bulb_conds = list(map(int, sys.stdin.readline().split())) +bulb_cond = 0 +for i, bc in enumerate(bulb_conds): +    bulb_cond |= bc << i -for s in range(1 << N): -    t = 0 +# N = 3 の時 +# 000, 001, 010, 011, 100, 101, 110, 111 の8パターンで、 +# スイッチを押す全てのパターンを表現することが出来る +for bit_ptn in range(1 << N): +    t = 0  # tはbit_ptnが表すスイッチの組み合わせを全て押したときの電球の状態を表す(最初は全部消えている) -        if s >> i & 1: -            t = t ^ mask_list[i] -    if t == conds_dec: +        if bit_ptn >> i & 1: +            t = t ^ bulb_list[i] +    if t == bulb_cond: