#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define se second
#define mp make_pair
#define fi first
#define del(a,vec) vec.erase(std::remove(vec.begin(), vec.end(), a), vec.end());
#define search(f,l,v) binary_search(f,l,v)
#define iter(a,b) vector<int>::iterator a,b
#define lower(v,num) lower_bound (v.begin(), v.end(), num);
#define upper(v,num) upper_bound (v.begin(), v.end(), num); 
#define removecopy(a) unique(a.begin(), a.end()); 
#define ll long long int
namespace Rahul{
    bool isPrime(int n) 
    {if (n <= 1)  return false; if (n <= 3)  return true; 
    if (n%2 == 0 || n%3 == 0) return false; 
    for (int i=5; i*i<=n; i=i+6) 
        if (n%i == 0 || n%(i+2) == 0) 
           return false; 
    return true; }
    ll pow (ll x, ll n,ll mod) {//calculate x^n
    if (n == 0) return 1;
 
    ll res = pow (x, n / 2,mod);
 
    res = (res * res) % mod;
    if (n % 2) res = (res * x ) % mod;
 
    return res;
    }
    ll _gcd(ll a,ll b)
    {
        if(a==0)
            return b;
        else    
            return _gcd(b%a,a);
    }
    //s.erase(s.find(2)) where s={1,2,3,3,2}; 
};
using namespace Rahul;
int main()
{
     ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
        // cout<<"hi\n";
    
    int n;
    cin>>n;
    unordered_map<int,int>cn;
    // int ans=0;
    vector<pair<int,int> >v[n+100];
    for(int i=0;i<n;i++)
        {
            int o;
            cin>>o;
            while(o--)
                {
                    int x,y;
                    cin>>x>>y;
                    x--;
                   v[i].pb(mp(x,y));
                //   cout<<x<<" "<<y<<endl;
                }
        }
   vector<string>cas;
   string s="";
   for(int i=0;i<n;i++)
      s+='1';
   
   cas.pb(s);
   
   
//   for(int i=0;i<n;i++)    {
//       for(int j=0;j<v[i].size();j++)
//       {
//           cout<<v[i][j].fi<<" "<<v[i][j].se<<endl;
//       }
//   }
   
//   int co=0;
   for(int i=0;i<n;i++)
   {
       int siz=cas.size();
       for(int j=0;j<siz;j++)
        {
            string jp=cas[j];
            jp[i]='0';
            cas.pb(jp);
        }
   }
   
//   for(int i=0;i<cas.size();i++)
//     {
//         cout<<cas[i]<<endl;
//     }
    
    int ans=0;
    for(int i=0;i<cas.size();i++)
    {
        string take=cas[i];
        bool flag=true;
        for(int j=0;j<take.size();j++)
        {
            
           
            if(take[j]=='1')
            {
                for(int k=0;k<v[j].size();k++)
                {
                    // cout<<"hi\n";
                    
                    pair<int,int>p=v[j][k];
                    // cout<<p.fi<<" "<<p.se<<endl;
                    if(p.se==1)
                    {
                        if(take[p.fi]=='0')
                            flag=false;
                    }
                    else if(p.se==0)
                    {
                        if(take[p.fi]=='1')
                            flag=false;
                    }
                }
                
            }
          
            
        }
        int co=0;
        if(flag)
            {
                // cout<<take<<endl;
                for(int j=0;j<take.size();j++)
                {
                    if(take[j]=='1')
                        co++;
                }
                ans=max(ans,co);  
            }
            
            
          
        
        
    }
    cout<<ans<<endl;
   
      
 
}

Measured memory_bytes: 2172