import Control.Monad
import Data.Array

main = do
  li <- getLine
  let n = read li
  xyss <- forM [1..n] (\_ -> do
    li <- getLine
    let k = read li
    forM [1..k] (\_ -> do
      li <- getLine
      let [x,y] = map read $ words li
      return (x,y)
      )
    )
  let ans = compute n xyss
  print ans

{-
全員分の正直1/不親切0の組み合わせを生成し、矛盾が生じないものの、
正直者の最大数を返す、で時間は間に合うだろうか？
ようは、不親切とラベルされた人の発言を除いたセットが矛盾しなければよい。
-}

compute :: Int -> [[(Int,Int)]] -> Int
compute n xyss = maximum $ map (check1 n xyss) $ sequence (replicate n [True,False])

{- 一つの設定について判定し、矛盾がなければ人数、あれば0を返す -}
check1 :: Int -> [[(Int,Int)]] -> [Bool] -> Int
check1 n xyss bs = if result then ts else 0
  where
    ba = listArray (1, n) bs
    xys = [xy | (xys, b) <- zip xyss bs, b, xy <- xys]
    f (x,1) = ba ! x
    f (x,0) = not (ba ! x)
    result = all f xys
    ts = length $ filter id bs
