// #include <bits/stdc++.h>
// #define FOR(i, m, n) for (int i = m; i < (n); i++)
// #define RFOR(i, m, n) for (int i = (m - 1); i >= 0; i--)
// #define REP(i, n) FOR(i, 0, n)
// #define RREP(i, n) RFOR(i, n, 0)
// #define ALL(v) v.begin(), v.end()
// #define RALL(v) v.rbegin(), v.rend()
// using namespace std;
// typedef long long ll;
// const int mod = 1e9 + 7;

// ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }

// ll factorial(ll n) {
//   ll answer = 1;
//   while (n > 1) {
//     answer *= n;
//     answer %= mod;
//     n--;
//   }
//   return answer;
// }

// ll combination(ll n, ll r) {
//   return factorial(n) / (factorial(r) * factorial(n - r));
// }

// ll permutation(ll n, ll r) { return factorial(n) / factorial(n - r); }

// template <typename T>
// void remove(std::vector<T>& vector, unsigned int index) {
//   vector.erase(vector.begin() + index);
// }

// map<ll, ll> prime_factor(ll n) {
//   map<ll, ll> ret;
//   for (ll i = 2; i * i <= n; i++) {
//     while (n % i == 0) {
//       ret[i]++;
//       n /= i;
//     }
//   }
//   if (n != 1) ret[n] = 1;
//   return ret;
// }
// // for (auto p : prime_factor(n)) {
// //	while (p.second--) {
// //		cout << p.first << endl;
// //	}
// //}

// vector<ll> divisor(ll n) {
//   vector<ll> ret;
//   for (ll i = 1; i * i <= n; i++) {
//     if (n % i == 0) {
//       ret.push_back(i);
//       if (i * i != n) ret.push_back(n / i);
//     }
//   }
//   sort(begin(ret), end(ret));
//   return (ret);
// }

// bool compare_by_b(pair<ll, ll> a, pair<ll, ll> b) {
//   if (a.second != b.second) {
//     return a.second < b.second;
//   } else {
//     return a.first < b.first;
//   }
// }

// typedef vector<int> ivec;
// typedef vector<string> svec;
// typedef vector<ll> lvec;

// int main() {
//   int n;
//   cin >> n;
//   vector<vector<int>> pp(n, vector<int>(0));
//   ivec p(n);
//   REP(i, n) {
//     int a;
//     cin >> a;
//     REP(j, a) {
//       int x, y;
//       cin >> x >> y;
//       x--;
//       if (p[i] == 1) {
//         p[x] = (y == 1 ? 1 : 0);
//       }
//     }
//   }
//   int ans = 0;
//   cout << "--------" << endl;
//   REP(i, n) {
//     cout << p[i] << endl;
//     if (p[i] == 1) {
//       ans++;
//     }
//   }
//   cout << ans << endl;
//   return 0;
// }

#include <bits/stdc++.h>
#define FOR(i, m, n) for (int i = m; i < (n); i++)
#define RFOR(i, m, n) for (int i = (m - 1); i >= 0; i--)
#define REP(i, n) FOR(i, 0, n)
#define RREP(i, n) RFOR(i, n, 0)
#define ALL(v) v.begin(), v.end()
#define RALL(v) v.rbegin(), v.rend()
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const ll INF = 1000000000000000000LL;

ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }

ll lcm(ll a, ll b) { return a * b / gcd(a, b); }

ll factorial(ll n) {
  ll answer = 1;
  while (n > 1) {
    answer *= n;
    answer %= mod;
    n--;
  }
  return answer;
}

ll combination(ll n, ll r) {
  return factorial(n) / (factorial(r) * factorial(n - r));
}

ll permutation(ll n, ll r) { return factorial(n) / factorial(n - r); }

template <typename T>
void remove(std::vector<T>& vector, unsigned int index) {
  vector.erase(vector.begin() + index);
}

map<ll, ll> prime_factor(ll n) {
  map<ll, ll> ret;
  for (ll i = 2; i * i <= n; i++) {
    while (n % i == 0) {
      ret[i]++;
      n /= i;
    }
  }
  if (n != 1) ret[n] = 1;
  return ret;
}
// for (auto p : prime_factor(n)) {
//	while (p.second--) {
//		cout << p.first << endl;
//	}
//}

vector<ll> divisor(ll n) {
  vector<ll> ret;
  for (ll i = 1; i * i <= n; i++) {
    if (n % i == 0) {
      ret.push_back(i);
      if (i * i != n) ret.push_back(n / i);
    }
  }
  sort(begin(ret), end(ret));
  return (ret);
}

bool compare_by_b(pair<ll, ll> a, pair<ll, ll> b) {
  if (a.second != b.second) {
    return a.second < b.second;
  } else {
    return a.first < b.first;
  }
}

vector<ll> Eratosthenes(const ll N) {
  bool is_prime[1000000 + 1];
  vector<ll> P;
  for (ll i = 0; i <= N; i++) {
    is_prime[i] = true;
  }
  for (ll i = 2; i <= N; i++) {
    if (is_prime[i]) {
      for (ll j = 2 * i; j <= N; j += i) {
        is_prime[j] = false;
      }
      P.emplace_back(i);
    }
  }
  return P;
}

typedef vector<int> ivec;
typedef vector<string> svec;
typedef vector<ll> lvec;

int g[15][15];

int main() {
  int n;
  cin >> n;
  REP(i, n) {
    REP(j, n) { g[i][j] = -1; }
  }

  REP(i, n) {
    int a;
    cin >> a;
    REP(j, a) {
      int x, y;
      cin >> x >> y;
      x--;
      g[i][x] = y;
    }
  }

  int ans = 0;
  REP(i, 1 << n) {
    ivec d(n);
    REP(j, n) {
      if (i >> j & 1) {
        d[j] = 1;
      }
    }
    bool ok = true;
    REP(j, n) {
      if (d[j]) {
        REP(k, n) {
          if (g[j][k] == -1) continue;
          if (g[j][k] != d[k]) ok = false;
        }
      }
    }
    if (ok) ans = max(ans, __builtin_popcount(i));
  }

  cout << ans << endl;
  return 0;
}

Measured memory_bytes: 256