#入力はn人のx,yに分けないといけない

n = int(eval(input()))

a = []

x = [[] for i in range(n)]

y = [[] for i in range(n)]

for i in range(n):

    a.append(int(eval(input())))

    for j in range(a[i]):

        xx, yy = (int(i) for i in input().split())

        x[i].append(xx)

        y[i].append(yy)



testimony = [[2]*n for i in range(n)]



for i in range(n):

    for j in range(a[i]):

        if (y[i][j] == 1):

            testimony[i][x[i][j] - 1] = 1#正直者ならtestimonyのxの位置に正直者である1を置く

        elif(y[i][j] == 0):

            testimony[i][x[i][j]-1] = 0#さっきの反対



ans = 0

for i in range(2**n):#2**n通りの「正直者」と「不親切な人」の全パターンを列挙

    bit_list = []

    for j in range(n):

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

            bit_list.append(1)#正直者なら

        else:

            bit_list.append(0)

    flag = 1

    #列挙した中からtestimony[k][l]と一致するのを探し、さらにその中からbit_listの最大値を求める

    for k in range(n):

        if(bit_list[k] == 1):

            for l in range(n):

                if(testimony[k][l] != 2):#２(デフォルト状態じゃないとき)

                    if(testimony[k][l] != bit_list[l]): #yの人の証言と食い違っていたらflagを0にする

                        flag = 0

                        break

    

    if(flag == 1):

        ans = max(sum(bit_list),ans)

print(ans)
n = int(eval(input()))

#2**n通りの正直者を全列挙してそれを矛盾が生じないか試していき最大値を求める 競合してる証言をピック　True or False で判断する

jud = [[-1 for i in range(n)] for j in range(n)]

xy = []

ayasi = []

for i in range(n):

    a = int(eval(input()))

    for j in range(a):

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

        jud[i][x-1] = y

Max = 0

for i in range(2**n):

    li = []

    flag = True

    cnt = 0

    for j in range(n):

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

            li.append(1)



        else:

            li.append(0)

    for k in range(n):

        if li[k] == 1:

         for l in range(n):

             if jud[k][l] != -1:

                 if jud[k][l] != li[l]:

                     flag = False

                     break



    if flag:

        Max = max(sum(li),Max)

print(Max)

# 入力はn人のx,yに分けないといけない
n = int(eval(input()))
a = []
x = [[] for i in range(n)]
y = [[] for i in range(n)]
for i in range(n):
    a.append(int(eval(input())))
    for j in range(a[i]):
        xx, yy = (int(i) for i in input().split())
        x[i].append(xx)
        y[i].append(yy)
testimony = [[2] * n for i in range(n)]
for i in range(n):
    for j in range(a[i]):
        if y[i][j] == 1:
            testimony[i][x[i][j] - 1] = 1  # 正直者ならtestimonyのxの位置に正直者である1を置く
        elif y[i][j] == 0:
            testimony[i][x[i][j] - 1] = 0  # さっきの反対
ans = 0
for i in range(2**n):  # 2**n通りの「正直者」と「不親切な人」の全パターンを列挙
    bit_list = []
    for j in range(n):
        if (i >> j) & 1:
            bit_list.append(1)  # 正直者なら
        else:
            bit_list.append(0)
    flag = 1
    # 列挙した中からtestimony[k][l]と一致するのを探し、さらにその中からbit_listの最大値を求める
    for k in range(n):
        if bit_list[k] == 1:
            for l in range(n):
                if testimony[k][l] != 2:  # ２(デフォルト状態じゃないとき)
                    if testimony[k][l] != bit_list[l]:  # yの人の証言と食い違っていたらflagを0にする
                        flag = 0
                        break
    if flag == 1:
        ans = max(sum(bit_list), ans)
print(ans)

n = int(eval(input()))
# 2**n通りの正直者を全列挙してそれを矛盾が生じないか試していき最大値を求める 競合してる証言をピック　True or False で判断する
jud = [[-1 for i in range(n)] for j in range(n)]
xy = []
ayasi = []
for i in range(n):
    a = int(eval(input()))
    for j in range(a):
        x, y = list(map(int, input().split()))
        jud[i][x - 1] = y
Max = 0
for i in range(2**n):
    li = []
    flag = True
    cnt = 0
    for j in range(n):
        if (i >> j) & 1:
            li.append(1)
        else:
            li.append(0)
    for k in range(n):
        if li[k] == 1:
            for l in range(n):
                if jud[k][l] != -1:
                    if jud[k][l] != li[l]:
                        flag = False
                        break
    if flag:
        Max = max(sum(li), Max)
print(Max)

-# 入力はn人のx,yに分けないといけない -a = [] -x = [[] for i in range(n)] -y = [[] for i in range(n)] +# 2**n通りの正直者を全列挙してそれを矛盾が生じないか試していき最大値を求める 競合してる証言をピック　True or False で判断する +jud = [[-1 for i in range(n)] for j in range(n)] +xy = [] +ayasi = [] -    a.append(int(eval(input()))) -    for j in range(a[i]): -        xx, yy = (int(i) for i in input().split()) -        x[i].append(xx) -        y[i].append(yy) -testimony = [[2] * n for i in range(n)] -for i in range(n): -    for j in range(a[i]): -        if y[i][j] == 1: -            testimony[i][x[i][j] - 1] = 1  # 正直者ならtestimonyのxの位置に正直者である1を置く -        elif y[i][j] == 0: -            testimony[i][x[i][j] - 1] = 0  # さっきの反対 -ans = 0 -for i in range(2**n):  # 2**n通りの「正直者」と「不親切な人」の全パターンを列挙 -    bit_list = [] +    a = int(eval(input())) +    for j in range(a): +        x, y = list(map(int, input().split())) +        jud[i][x - 1] = y +Max = 0 +for i in range(2**n): +    li = [] +    flag = True +    cnt = 0 -            bit_list.append(1)  # 正直者なら +            li.append(1) -            bit_list.append(0) -    flag = 1 -    # 列挙した中からtestimony[k][l]と一致するのを探し、さらにその中からbit_listの最大値を求める +            li.append(0) -        if bit_list[k] == 1: +        if li[k] == 1: -                if testimony[k][l] != 2:  # ２(デフォルト状態じゃないとき) -                    if testimony[k][l] != bit_list[l]:  # yの人の証言と食い違っていたらflagを0にする -                        flag = 0 +                if jud[k][l] != -1: +                    if jud[k][l] != li[l]: +                        flag = False -    if flag == 1: -        ans = max(sum(bit_list), ans) -print(ans) +    if flag: +        Max = max(sum(li), Max) +print(Max)