Furik and Rubik love playing computer games. Furik has recently found a new game that greatly interested Rubik. The game consists of n parts and to complete each part a player may probably need to complete some other ones. We know that the game can be fully completed, that is, its parts do not form cyclic dependencies. 

Rubik has 3 computers, on which he can play this game. All computers are located in different houses. Besides, it has turned out that each part of the game can be completed only on one of these computers. Let's number the computers with integers from 1 to 3. Rubik can perform the following actions: 

  * Complete some part of the game on some computer. Rubik spends exactly 1 hour on completing any part on any computer. 
  * Move from the 1-st computer to the 2-nd one. Rubik spends exactly 1 hour on that. 
  * Move from the 1-st computer to the 3-rd one. Rubik spends exactly 2 hours on that. 
  * Move from the 2-nd computer to the 1-st one. Rubik spends exactly 2 hours on that. 
  * Move from the 2-nd computer to the 3-rd one. Rubik spends exactly 1 hour on that. 
  * Move from the 3-rd computer to the 1-st one. Rubik spends exactly 1 hour on that. 
  * Move from the 3-rd computer to the 2-nd one. Rubik spends exactly 2 hours on that. 



Help Rubik to find the minimum number of hours he will need to complete all parts of the game. Initially Rubik can be located at the computer he considers necessary. 

Input

The first line contains integer n (1 ≤ n ≤ 200) — the number of game parts. The next line contains n integers, the i-th integer — ci (1 ≤ ci ≤ 3) represents the number of the computer, on which you can complete the game part number i. 

Next n lines contain descriptions of game parts. The i-th line first contains integer ki (0 ≤ ki ≤ n - 1), then ki distinct integers ai, j (1 ≤ ai, j ≤ n; ai, j ≠ i) — the numbers of parts to complete before part i.

Numbers on all lines are separated by single spaces. You can assume that the parts of the game are numbered from 1 to n in some way. It is guaranteed that there are no cyclic dependencies between the parts of the game.

Output

On a single line print the answer to the problem.

Examples

Input

1
1
0


Output

1


Input

5
2 2 1 1 3
1 5
2 5 1
2 5 4
1 5
0


Output

7

Note

Note to the second sample: before the beginning of the game the best strategy is to stand by the third computer. First we complete part 5. Then we go to the 1-st computer and complete parts 3 and 4. Then we go to the 2-nd computer and complete parts 1 and 2. In total we get 1+1+2+1+2, which equals 7 hours.
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000000 + 7;
const long long MOD1 = 998244353;
string itos(long long s) {
  string str = to_string(s);
  return str;
}
long long stoi2(string s) {
  long long a = atoi(s.c_str());
  return a;
}
template <typename T>
void read(T &p) {
  cin >> p;
}
template <typename T, typename T1>
void read(pair<T, T1> &p) {
  read(p.first);
  read(p.second);
}
template <typename T>
void read(T arr[], long long n) {
  for (long long i = 0; i < n; i++) {
    read(arr[i]);
  }
}
template <typename T>
void read(vector<T> &arr) {
  for (long long i = 0; i < arr.size(); i++) {
    read(arr[i]);
  }
}
template <typename T>
void out(T &n) {
  cout << n;
}
template <typename T, typename T1>
void out(pair<T, T1> &p) {
  cout << "(";
  out(p.first);
  cout << ",";
  out(p.second);
  cout << ")";
  cout << endl;
}
template <typename T>
void out(T arr[], long long n) {
  for (long long i = 0; i < n; i++) {
    out(arr[i]);
    cout << " ";
  }
  cout << endl;
}
template <typename T>
void out(vector<T> &arr) {
  for (long long i = 0; i < arr.size(); i++) {
    out(arr[i]);
    if (i != arr.size() - 1) cout << " ";
  }
  cout << endl;
}
template <typename T>
void out(set<T> &arr) {
  for (auto i : arr) {
    out(i);
    cout << " ";
  }
  cout << endl;
}
template <typename T>
void out(multiset<T> &arr) {
  for (auto i : arr) {
    out(i);
    cout << " ";
  }
  cout << endl;
}
template <typename T, typename T1>
void out(map<T, T1> &m) {
  for (auto i : m) {
    out(i.first);
    cout << " -> ";
    out(i.second);
    cout << ", ";
  }
  cout << endl;
}
long long powerm(long long a, long long b, long long MOD) {
  a %= MOD;
  long long res = 1;
  while (b > 0) {
    if (b & 1) res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
long long power(long long a, long long b) {
  long long res = 1;
  while (b > 0) {
    if (b & 1) res = res * a;
    a = a * a;
    b >>= 1;
  }
  return res;
}
bool isSubSequence(string str1, string str2, int m, int n) {
  if (m == 0) return true;
  if (n == 0) return false;
  if (str1[m - 1] == str2[n - 1])
    return isSubSequence(str1, str2, m - 1, n - 1);
  return isSubSequence(str1, str2, m, n - 1);
}
bool ispalindrome(long long len, string str) {
  for (int i = 0; i < len / 2; i++) {
    if (str[i] != str[len - 1 - i]) {
      return false;
    }
  }
  return true;
}
inline bool isPowerOfTwo(long long x) {
  return ((1LL << (long long)log2(x)) == x);
}
long long isprime(long long N) {
  if (N < 2 || (!(N & 1) && N != 2)) return 0;
  for (long long i = 3; i * i <= N; i += 2) {
    if (!(N % i)) return 0;
  }
  return 1;
}
vector<long long> factor;
void factors(long long n) {
  for (long long i = 1; i <= sqrt(n); i++) {
    if (n % i == 0) {
      if (i == n / i)
        factor.push_back(i);
      else {
        factor.push_back(i);
        factor.push_back(n / i);
      }
    }
  }
  sort((factor).begin(), (factor).end());
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return (a / gcd(a, b)) * b; }
bool isvalid(long long i, long long j, long long n) {
  if (i >= 0 && i < n && j >= 0 && j < n) return true;
  return false;
}
long long dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
long long dy[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
long long binarytodecimal(string n) {
  string num = n;
  long long dec_value = 0;
  long long base = 1;
  long long len = num.length();
  for (int i = len - 1; i >= 0; i--) {
    if (num[i] == '1') dec_value += base;
    base = base * 2;
  }
  return dec_value;
}
long long extended_GCD(long long a, long long b, long long &x, long long &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x1, y1;
  long long gcd = extended_GCD(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return gcd;
}
long long modinv(long long a, long long mod = MOD) {
  long long x, y;
  extended_GCD(a, mod, x, y);
  if (x < 0) x += mod;
  return x;
}
string dtb(long long n) {
  string s = "";
  while (n > 0) {
    if (n % 2 == 0)
      s.push_back('0');
    else
      s.push_back('1');
    n /= 2;
  }
  reverse((s).begin(), (s).end());
  return s;
}
long long getfactorisation(long long n) {
  long long N = 5e6 + 5;
  vector<long long> fact(N);
  for (int i = 0; i < N; i++) fact[i] = i;
  for (int i = 2; i < N; i += 2) fact[i] = 2;
  for (long long i = 3; i <= N; i += 2)
    if (i == fact[i])
      for (long long j = i * i; j < N; j += i)
        if (fact[j] == j) fact[j] = i;
  vector<long long> res;
  while (n > 1) {
    res.push_back(fact[n]);
    n /= fact[n];
  }
  return res.size();
}
long long maxPrimeFactor(long long n) {
  long long maxPrime = -1;
  while (n % 2 == 0) {
    maxPrime = 2;
    n >>= 1;
  }
  for (int i = 3; i <= sqrt(n); i += 2) {
    while (n % i == 0) {
      maxPrime = i;
      n = n / i;
    }
  }
  if (n > 2) maxPrime = n;
  return maxPrime;
}
vector<long long> seive;
void Seive() {
  const long long maxn = 1e6 + 5;
  seive.resize(maxn);
  for (long long i = (long long)0; i < (long long)maxn; i++) seive[i] = i;
  for (long long i = 2; i <= maxn; i += 2) seive[i] = 2;
  seive[1] = -1;
  seive[0] = -1;
  for (long long i = 3; i <= maxn; i += 2)
    if (i == seive[i])
      for (long long j = i * i; j < maxn; j += i)
        if (seive[j] == j) seive[j] = i;
}
void factorisation(long long n) {
  vector<long long> res;
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      while (n % i == 0) {
        n /= i;
        res.push_back(i);
      }
    }
  }
  if (n > 1) res.push_back(n);
}
int numOfDivisors[100005] = {0};
void noOfDivisor() {
  for (int i = 1; i <= 100005; i++)
    for (int j = i; j <= 100005; j += i) {
      numOfDivisors[j]++;
    }
}
long long fac[200005];
unsigned long long modInverse(unsigned long long n, int p) {
  return powerm(n, p - 2, p);
}
long long nCrModPFermat(unsigned long long n, int r, int p) {
  if (n < r) return 0;
  if (r == 0) return 1;
  unsigned long long fac[n + 1];
  fac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = (fac[i - 1] * i) % p;
  return (fac[n] * modInverse(fac[r], p) % p * modInverse(fac[n - r], p) % p) %
         p;
}
vector<long long> ad[205];
vector<long long> v(205);
vector<long long> in(205);
long long n;
long long kahn(long long st, long long ch) {
  long long round = 0;
  vector<long long> ans;
  queue<long long> q;
  for (long long i = (long long)1; i < (long long)n + 1; i++)
    if (in[i] == 0) q.push(i);
  long long comp = v[q.front() - 1];
  while (!q.empty()) {
    long long again = 0;
    long long fr = q.front() - 1;
    queue<long long> run;
    queue<long long> q2;
    while (!q.empty()) {
      if (v[q.front() - 1] == st)
        run.push(q.front());
      else
        q2.push(q.front());
      q.pop();
    }
    while (!run.empty()) {
      fr = run.front();
      for (auto x : ad[fr]) {
        in[x]--;
        if (in[x] == 0) {
          q2.push(x);
          if (v[x - 1] == st) again = 1;
        }
      }
      run.pop();
      ans.push_back(fr);
    }
    while (!q2.empty()) {
      q.push(q2.front());
      q2.pop();
    }
    if (again == 0) {
      st += 1;
      st %= 3;
      if (st == 0) st = 3;
      if (!q.empty()) round++;
    }
  }
  if (ans.size() != n) round = (long long)(9e18);
  return round;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  long long T = 1;
  while (T--) {
    cin >> n;
    for (long long i = (long long)0; i < (long long)n; i++) cin >> v[i];
    for (long long i = (long long)1; i < (long long)n + 1; i++) {
      long long k;
      cin >> k;
      for (long long j = (long long)0; j < (long long)k; j++) {
        long long g;
        cin >> g;
        ad[g].push_back(i);
        in[i]++;
      }
    }
    vector<long long> in2 = in;
    long long r1 = kahn(1, 3);
    in = in2;
    r1 = min(r1, kahn(2, 1));
    in = in2;
    r1 = min(r1, kahn(3, 1));
    cout << n + r1;
    cout << '\n';
  }
}
