#ABC-147

#参考 https://atcoder.jp/contests/abc147/submissions/8896111

N = int(eval(input()))

evidences = [[] for i in range(N)]



for i in range(N):

    A = int(eval(input()))

    for _ in range(A):

        x, y = list(map(int, input().split()))

        evidences[i].append((x-1, y))



result = 0

for i in range(1, 2**N):

    consistent = True

    for j in range(N):

        #すでに矛盾するパターンのiとわかっているならば飛ばす。

        if consistent == False:

            break

        #jが正しいと仮定する。(もし0ならcontinueで飛ばされる。)

        if (i >> j) & 1 == 0:

            continue

        #jの証言を一個ずつ確認していく。

        for x, y in evidences[j]:            

            if (i >> x) & 1 != y:

                consistent = False

                break

    #全ての人の証言で矛盾がないパターンのiだったら、1の数(=正直者の数)をresultに記録しておく。

    if consistent == True:

        result = max(result, bin(i)[2:].count("1"))



print(result)
N = int(eval(input()))



memo = [[] for _ in range(N)]

ans = 0



for i in range(N):

    A = int(eval(input()))

    for _ in range(A):

        #配列が0始まりなので、xは-1して使用する

        x, y = list(map(int, input().split()))

        memo[i].append((x,y))



# print(memo)

for i in range(2**N):

    # print(i)#test

    flag = True

    for j in range(N):

        # bitが1の人の証言を確認していく。

        if i >> j & 1:

            for evidence in memo[j]:

                check_evidence = int(bin(i >> (evidence[0]-1))[-1])

                if check_evidence != evidence[1]:

                    # print(check_evidence==evidence[1])

                    flag = False

                    break

        if not flag:

            break

    if flag:

        bin_i = bin(i)

        ans = max(ans, bin_i.count("1"))



print(ans)

# ABC-147
# 参考 https://atcoder.jp/contests/abc147/submissions/8896111
N = int(eval(input()))
evidences = [[] for i in range(N)]
for i in range(N):
    A = int(eval(input()))
    for _ in range(A):
        x, y = list(map(int, input().split()))
        evidences[i].append((x - 1, y))
result = 0
for i in range(1, 2**N):
    consistent = True
    for j in range(N):
        # すでに矛盾するパターンのiとわかっているならば飛ばす。
        if consistent == False:
            break
        # jが正しいと仮定する。(もし0ならcontinueで飛ばされる。)
        if (i >> j) & 1 == 0:
            continue
        # jの証言を一個ずつ確認していく。
        for x, y in evidences[j]:
            if (i >> x) & 1 != y:
                consistent = False
                break
    # 全ての人の証言で矛盾がないパターンのiだったら、1の数(=正直者の数)をresultに記録しておく。
    if consistent == True:
        result = max(result, bin(i)[2:].count("1"))
print(result)

N = int(eval(input()))
memo = [[] for _ in range(N)]
ans = 0
for i in range(N):
    A = int(eval(input()))
    for _ in range(A):
        # 配列が0始まりなので、xは-1して使用する
        x, y = list(map(int, input().split()))
        memo[i].append((x, y))
# print(memo)
for i in range(2**N):
    # print(i)#test
    flag = True
    for j in range(N):
        # bitが1の人の証言を確認していく。
        if i >> j & 1:
            for evidence in memo[j]:
                check_evidence = int(bin(i >> (evidence[0] - 1))[-1])
                if check_evidence != evidence[1]:
                    # print(check_evidence==evidence[1])
                    flag = False
                    break
        if not flag:
            break
    if flag:
        bin_i = bin(i)
        ans = max(ans, bin_i.count("1"))
print(ans)

-# ABC-147 -# 参考 https://atcoder.jp/contests/abc147/submissions/8896111 -evidences = [[] for i in range(N)] +memo = [[] for _ in range(N)] +ans = 0 +        # 配列が0始まりなので、xは-1して使用する -        evidences[i].append((x - 1, y)) -result = 0 -for i in range(1, 2**N): -    consistent = True +        memo[i].append((x, y)) +# print(memo) +for i in range(2**N): +    # print(i)#test +    flag = True -        # すでに矛盾するパターンのiとわかっているならば飛ばす。 -        if consistent == False: +        # bitが1の人の証言を確認していく。 +        if i >> j & 1: +            for evidence in memo[j]: +                check_evidence = int(bin(i >> (evidence[0] - 1))[-1]) +                if check_evidence != evidence[1]: +                    # print(check_evidence==evidence[1]) +                    flag = False +                    break +        if not flag: -        # jが正しいと仮定する。(もし0ならcontinueで飛ばされる。) -        if (i >> j) & 1 == 0: -            continue -        # jの証言を一個ずつ確認していく。 -        for x, y in evidences[j]: -            if (i >> x) & 1 != y: -                consistent = False -                break -    # 全ての人の証言で矛盾がないパターンのiだったら、1の数(=正直者の数)をresultに記録しておく。 -    if consistent == True: -        result = max(result, bin(i)[2:].count("1")) -print(result) +    if flag: +        bin_i = bin(i) +        ans = max(ans, bin_i.count("1")) +print(ans)