'''

N人の「正直者」、「不親切な人」のすべての組み合わせを生成し、

正直者の証言が組み合わせに矛盾していないか確認する. 

矛盾していない組み合わせの正直者の最大数が解答.

組み合わせは bit で表現している. Nビット用意し、

1が立っていると正直者、0だと不親切な人. 

この組み合わせ状況と正直者の証言が矛盾しないか確認する.

'''

N = int(eval(input()))



evidences = [[] for _ 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):

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

            continue

        for x, y in evidences[j]:

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

                consistent = False

                break

        if not consistent:

            break

    if consistent:

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

print(result)
import itertools 

N = int(eval(input()))

evidence_dit = {} 

for i in range(N):

    A = int(eval(input()))

    x_y = []

    if A == 0:

        evidence_dit[i] = []

    for j in range(A):

        x_y.append(list(map(int,input().split())))        

        evidence_dit[i] = x_y 

ans = 0

attribute = [0,1] 

for i in itertools.product(attribute,repeat=N):

    flag = False    

    for j in range(N):

       if i[j] == 1:            

            for k in evidence_dit[j]:

                if i[k[0]-1] != k[1]:

                    flag = True

                    break

            if flag:

                break 

    if flag == False:

        ans = max(ans,sum(i))        

print(ans)

'''

入力:辞書型で置いておくことにした。

{0: [[2, 1], [3, 0]], 1: [[3, 1], [1, 0]], 2: [[1, 1], [2, 0]]}

証言が無い場合に [ ] を入れる。

attribute = [0,1] 

for i in itertools.product(attribute,repeat=N):

正直、不正直のパターンを列挙するところ、itertoolsで0,1の重複順列

for i in range(2 ** N):

    h = [0] * N 

    for j in range(N):

        if (i >> j) & 1:

            h[j] = 1

ビット演算子

i >> j　i を右に j ビットシフト

5 >> 2　5 を右に 2 ビットシフト

　　　　 101｜　➡　001｜01　➡　001

　　　　 右へ２つずらして足りなくなった桁は0にする。　

5 & 1　➡　101 AND 001　➡　001

　　　　　　両方１のところだけ１になる。

if 5 & 1:　5 & 1 の答えが１なら True、他は False

[0, 0, 0] [1, 0, 0] [0, 1, 0] [1, 1, 0] [0, 0, 1] [1, 0, 1] 

[0, 1, 1] [1, 1, 1]、のような0,1の全パターンを出している。

'''
"""
N人の「正直者」、「不親切な人」のすべての組み合わせを生成し、
正直者の証言が組み合わせに矛盾していないか確認する. 
矛盾していない組み合わせの正直者の最大数が解答.
組み合わせは bit で表現している. Nビット用意し、
1が立っていると正直者、0だと不親切な人. 
この組み合わせ状況と正直者の証言が矛盾しないか確認する.
"""
N = int(eval(input()))
evidences = [[] for _ 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):
        if (i >> j) & 1 == 0:
            continue
        for x, y in evidences[j]:
            if (i >> x) & 1 != y:
                consistent = False
                break
        if not consistent:
            break
    if consistent:
        result = max(result, bin(i)[2:].count("1"))
print(result)

import itertools

N = int(eval(input()))
evidence_dit = {}
for i in range(N):
    A = int(eval(input()))
    x_y = []
    if A == 0:
        evidence_dit[i] = []
    for j in range(A):
        x_y.append(list(map(int, input().split())))
        evidence_dit[i] = x_y
ans = 0
attribute = [0, 1]
for i in itertools.product(attribute, repeat=N):
    flag = False
    for j in range(N):
        if i[j] == 1:
            for k in evidence_dit[j]:
                if i[k[0] - 1] != k[1]:
                    flag = True
                    break
            if flag:
                break
    if flag == False:
        ans = max(ans, sum(i))
print(ans)
"""
入力:辞書型で置いておくことにした。
{0: [[2, 1], [3, 0]], 1: [[3, 1], [1, 0]], 2: [[1, 1], [2, 0]]}
証言が無い場合に [ ] を入れる。
attribute = [0,1] 
for i in itertools.product(attribute,repeat=N):
正直、不正直のパターンを列挙するところ、itertoolsで0,1の重複順列
for i in range(2 ** N):
    h = [0] * N 
    for j in range(N):
        if (i >> j) & 1:
            h[j] = 1
ビット演算子
i >> j　i を右に j ビットシフト
5 >> 2　5 を右に 2 ビットシフト
　　　　 101｜　➡　001｜01　➡　001
　　　　 右へ２つずらして足りなくなった桁は0にする。　
5 & 1　➡　101 AND 001　➡　001
　　　　　　両方１のところだけ１になる。
if 5 & 1:　5 & 1 の答えが１なら True、他は False
[0, 0, 0] [1, 0, 0] [0, 1, 0] [1, 1, 0] [0, 0, 1] [1, 0, 1] 
[0, 1, 1] [1, 1, 1]、のような0,1の全パターンを出している。
"""

-""" -N人の「正直者」、「不親切な人」のすべての組み合わせを生成し、 -正直者の証言が組み合わせに矛盾していないか確認する. -矛盾していない組み合わせの正直者の最大数が解答. -組み合わせは bit で表現している. Nビット用意し、 -1が立っていると正直者、0だと不親切な人. -この組み合わせ状況と正直者の証言が矛盾しないか確認する. -""" +import itertools + -evidences = [[] for _ in range(N)] +evidence_dit = {} -    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 +    x_y = [] +    if A == 0: +        evidence_dit[i] = [] +    for j in range(A): +        x_y.append(list(map(int, input().split()))) +        evidence_dit[i] = x_y +ans = 0 +attribute = [0, 1] +for i in itertools.product(attribute, repeat=N): +    flag = False -        if (i >> j) & 1 == 0: -            continue -        for x, y in evidences[j]: -            if (i >> x) & 1 != y: -                consistent = False +        if i[j] == 1: +            for k in evidence_dit[j]: +                if i[k[0] - 1] != k[1]: +                    flag = True +                    break +            if flag: -        if not consistent: -            break -    if consistent: -        result = max(result, bin(i)[2:].count("1")) -print(result) +    if flag == False: +        ans = max(ans, sum(i)) +print(ans) +""" +入力:辞書型で置いておくことにした。 +{0: [[2, 1], [3, 0]], 1: [[3, 1], [1, 0]], 2: [[1, 1], [2, 0]]} +証言が無い場合に [ ] を入れる。 +attribute = [0,1] +for i in itertools.product(attribute,repeat=N): +正直、不正直のパターンを列挙するところ、itertoolsで0,1の重複順列 +for i in range(2 ** N): +    h = [0] * N +    for j in range(N): +        if (i >> j) & 1: +            h[j] = 1 +ビット演算子 +i >> j　i を右に j ビットシフト +5 >> 2　5 を右に 2 ビットシフト +　　　　 101｜　➡　001｜01　➡　001 +　　　　 右へ２つずらして足りなくなった桁は0にする。 +5 & 1　➡　101 AND 001　➡　001 +　　　　　　両方１のところだけ１になる。 +if 5 & 1:　5 & 1 の答えが１なら True、他は False +[0, 0, 0] [1, 0, 0] [0, 1, 0] [1, 1, 0] [0, 0, 1] [1, 0, 1] +[0, 1, 1] [1, 1, 1]、のような0,1の全パターンを出している。 +"""