Buggy python submission (verdict: Time Limit Exceeded):
n = int(input())
a = [0]*n
x = [[0] *n for i in range(n)]
y = [[0] *n for i in range(n)]
ans = 0
for i in range(n):
    a[i] = int(input())
    for j in range(a[i]):
        x[i][j],y[i][j] = map(int,input().split())
        x[i][j]-=1
def honest(i,j):
    return (i>>j)%2 ==1
def check(m):
    for i in range(n):
        if not honest(m,i) :continue
        for j in range(a[i]):
            if y[i][j] == 1 and honest(m,x[i][j]) == 0:
                return False
            if y[i][j] == 0 and honest(m,x[i][j]) == 1:
                return False
    return True
def count(c):
    cnt = 0
    for i in range(c//2+5):
        cnt+= (c >> i)%2
    return cnt
for i in range(2**n):
    if check(i):
        ans = max(ans,count(i))
    
        
        
        
print(ans)
        

Fixed submission:
n = int(input())
a =[0]*n
x = [[0] *n for i in range(n)]
y = [[0] *n for i in range(n)]
ans = []
for i in range(n):
    a[i] = int(input())
    for j in range(a[i]):
        x[i][j],y[i][j] = map(int,input().split())
        x[i][j]-=1
        
ishonest= [-1]*n + [0]
def check(ishonest):
    for i in range(n):
        if not ishonest[i]:continue
        for j in range(a[i]):
            if y[i][j] == 1 and ishonest[x[i][j]] == 0:
                return False
            if y[i][j] == 0 and ishonest[x[i][j]] == 1:
                return False
    return True

def dfs(now,h_or_not= -1):
    ishonest[now] = h_or_not
    if now == n-1:
        if check(ishonest):
      
            return sum(ishonest)+1
        else:
            return 0
  
    return max(dfs(now+1,0),dfs(now+1,1))

print(dfs(-1))

Buggy python submission (verdict: Runtime Error):
n = int(input())
xy = []
ansp = []
people =[-1]*n
sp = [-1]*n



for i in range(n):
    a = int(input())
    for j in range(a):
        x, y = map(int,input().split())
        xy.append([x-1,y])
def dfs(now,ok):
    global sp
    global people
    if now ==n:
        ansp.append(people.count(1))
        sp = [-1]*n
        people = [-1]*n
        return
    if len(xy[now]) >0:
        for i in range(len(xy[now])):
            x = xy[i][0]
            y = xy[i][1]
            if ok:
                if sp[x] == y or sp[x] == -1:
                    sp[x] = y
                else:continue
            else:
                if sp[x] == y^1 or sp[x] == -1:
                    sp[x] == y^1
                else:continue
    
        
        
    people[now] = ok    
    dfs(now+1,ok)
    dfs(now+1,ok^1)
dfs(0,0)
dfs(0,1)
if len(ansp) == 0:
    print(0)
    exit(0)
print(max(ansp))    
        
        


        
            

Fixed submission:
n = int(input())
a =[0]*n
x = [[0] *n for i in range(n)]
y = [[0] *n for i in range(n)]
ans = []
for i in range(n):
    a[i] = int(input())
    for j in range(a[i]):
        x[i][j],y[i][j] = map(int,input().split())
        x[i][j]-=1
        
ishonest= [-1]*n + [0]
def check(ishonest):
    for i in range(n):
        if not ishonest[i]:continue
        for j in range(a[i]):
            if y[i][j] == 1 and ishonest[x[i][j]] == 0:
                return False
            if y[i][j] == 0 and ishonest[x[i][j]] == 1:
                return False
    return True

def dfs(now,h_or_not= -1):
    ishonest[now] = h_or_not
    if now == n-1:
        if check(ishonest):
      
            return sum(ishonest)+1
        else:
            return 0
  
    return max(dfs(now+1,0),dfs(now+1,1))

print(dfs(-1))