from sys import stdin





def main():

    lines = stdin.readlines()

    N, M = list(map(int, lines[0].split()))

    print((sum(1

              for i in range(1 << N)

              if sum(1

                     for s, p in zip(

                         (sum(1 << int(j) - 1

                              for j in i.split()[1:])

                          for i in lines[1:-1]),

                         (int(i)

                          for i in lines[-1].split()))

                     if bin(i & s).count("1") % 2 == p) == M)))

    return





main()

from sys import stdin





def f(s, p, P, i):

    # 再帰

    # 順にスイッチを見ていく

    if len(s) == i:

        return 1 if P == p else 0

    # 場合の数

    # そのスイッチを使用しなかった場合 + 使用した場合

    return f(s, p, P, i + 1) + f(s, p, P ^ s[i], i + 1)





def main():

    lines = stdin.readlines()

    N, M = list(map(int, lines[0].split()))

    sn = [[int(j) for j in i.split()[1:]] for i in lines[1:-1]]

    pn = (int(i) for i in lines[-1].split())

    # s[スイッチID]

    # 2進数における桁はそのスイッチを使用している電球

    s = [0] * N

    for i in range(M):

        for j in sn[i]:

            s[j - 1] |= (1 << i)

    # p

    # 2進数における桁は電球 ゼロイチをそのまま2進数とする

    p = 0

    for i, j in enumerate(pn):

        p |= (1 << i) if j == 1 else 0

    print((f(s, p, 0, 0)))





main()

from sys import stdin


def main():
    lines = stdin.readlines()
    N, M = list(map(int, lines[0].split()))
    print(
        (
            sum(
                1
                for i in range(1 << N)
                if sum(
                    1
                    for s, p in zip(
                        (
                            sum(1 << int(j) - 1 for j in i.split()[1:])
                            for i in lines[1:-1]
                        ),
                        (int(i) for i in lines[-1].split()),
                    )
                    if bin(i & s).count("1") % 2 == p
                )
                == M
            )
        )
    )
    return


main()

from sys import stdin


def f(s, p, P, i):
    # 再帰
    # 順にスイッチを見ていく
    if len(s) == i:
        return 1 if P == p else 0
    # 場合の数
    # そのスイッチを使用しなかった場合 + 使用した場合
    return f(s, p, P, i + 1) + f(s, p, P ^ s[i], i + 1)


def main():
    lines = stdin.readlines()
    N, M = list(map(int, lines[0].split()))
    sn = [[int(j) for j in i.split()[1:]] for i in lines[1:-1]]
    pn = (int(i) for i in lines[-1].split())
    # s[スイッチID]
    # 2進数における桁はそのスイッチを使用している電球
    s = [0] * N
    for i in range(M):
        for j in sn[i]:
            s[j - 1] |= 1 << i
    # p
    # 2進数における桁は電球 ゼロイチをそのまま2進数とする
    p = 0
    for i, j in enumerate(pn):
        p |= (1 << i) if j == 1 else 0
    print((f(s, p, 0, 0)))


main()

+ + +def f(s, p, P, i): +    # 再帰 +    # 順にスイッチを見ていく +    if len(s) == i: +        return 1 if P == p else 0 +    # 場合の数 +    # そのスイッチを使用しなかった場合 + 使用した場合 +    return f(s, p, P, i + 1) + f(s, p, P ^ s[i], i + 1) -    print( -        ( -            sum( -                1 -                for i in range(1 << N) -                if sum( -                    1 -                    for s, p in zip( -                        ( -                            sum(1 << int(j) - 1 for j in i.split()[1:]) -                            for i in lines[1:-1] -                        ), -                        (int(i) for i in lines[-1].split()), -                    ) -                    if bin(i & s).count("1") % 2 == p -                ) -                == M -            ) -        ) -    ) -    return +    sn = [[int(j) for j in i.split()[1:]] for i in lines[1:-1]] +    pn = (int(i) for i in lines[-1].split()) +    # s[スイッチID] +    # 2進数における桁はそのスイッチを使用している電球 +    s = [0] * N +    for i in range(M): +        for j in sn[i]: +            s[j - 1] |= 1 << i +    # p +    # 2進数における桁は電球 ゼロイチをそのまま2進数とする +    p = 0 +    for i, j in enumerate(pn): +        p |= (1 << i) if j == 1 else 0 +    print((f(s, p, 0, 0)))