#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200;
const int INF = (1 << 29);
int tipo[MAXN + 2];
vector<int> hijos[MAXN + 2];
vector<int> padres[MAXN + 2];
int cuantos_depende[MAXN + 2];
queue<int> cola[3 + 2];
void limpia(queue<int>& q) {
  while (!q.empty()) q.pop();
}
void comete(int i) {
  for (int sig : hijos[i]) {
    cuantos_depende[sig]--;
    if (cuantos_depende[sig] == 0) {
      cola[tipo[sig]].push(sig);
    }
  }
}
int resuelve(int N, int tipo_inicial) {
  limpia(cola[1]);
  limpia(cola[2]);
  limpia(cola[3]);
  for (int i = 1; i <= N; i++) {
    cuantos_depende[i] = padres[i].size();
    if (cuantos_depende[i] == 0) {
      cola[tipo[i]].push(i);
    }
  }
  int act = tipo_inicial, resp = 0;
  int comidos = 0;
  while (comidos < N) {
    if (cola[act].empty()) {
      act = (act % 3) + 1;
    } else {
      comidos++;
      comete(cola[act].front());
      cola[act].pop();
    }
    resp++;
  }
  return resp;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int N;
  cin >> N;
  for (int i = 1; i <= N; i++) {
    cin >> tipo[i];
  }
  for (int i = 1; i <= N; i++) {
    int k;
    cin >> k;
    while (k-- > 0) {
      int p;
      cin >> p;
      hijos[p].push_back(i);
      padres[i].push_back(p);
    }
  }
  int resp = min(resuelve(N, 1), min(resuelve(N, 2), resuelve(N, 3)));
  cout << resp << "\n";
  return 0;
}
