There are three arrays a, b and c. Each of them consists of n integers. SmallY wants to find three integers u, v, w (0 ≤ u, v, w ≤ n) such that the following condition holds: each number that appears in the union of a, b and c, appears either in the first u elements of a, or in the first v elements of b, or in the first w elements of c. Of course, SmallY doesn't want to have huge numbers u, v and w, so she wants sum u + v + w to be as small as possible.

Please, help her to find the minimal possible sum of u + v + w.

Input

The first line contains a single integer n (1 ≤ n ≤ 105). The second line contains n space-separated integers a1, a2, ..., an — array a. The third line contains the description of array b in the same format. The fourth line contains the description of array c in the same format. The following constraint holds: 1 ≤ ai, bi, ci ≤ 109.

Output

Print a single integer — the minimum possible sum of u + v + w.

Examples

Input

3
1 1 101
1 2 1
3 2 1


Output

5

Input

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


Output

5

Note

In the first example you should choose u = 3, v = 0, w = 2. 

In the second example you should choose u = 1, v = 3, w = 1.
1
2
3
2
 8
190409007 190409007 352375776 190409007 352375776 352375776 352375776 352375776
190409007 190409007 190409007 190409007 190409007 352375776 352375776 190409007
190409007 352375776 352375776 190409007 190409007 190409007 352375776 352375776
 1
1
1
1
 1
377489979
588153796
588153796
 2
1 1
2 2
3 3
 4
1 1 1 1
1 1 1 1
1 1 1 1
 2
1 2
2 2
1 1
 3
1 1 2
1 1 3
1 1 4

2
 2
 1
 2
 3
 1
 2
 9

#include <bits/stdc++.h>
using namespace std;
long long rdtsc() {
  long long tmp;
  asm("rdtsc" : "=A"(tmp));
  return tmp;
}
inline int mrand() {
  return abs((rand() << 15) ^ rand());
  ;
}
inline int rng(int bound) { return mrand() % bound; }
const long double pi = acos(-1.0);
const int inf = 1e9 + 5;
const long long linf = 4e18 + 5;
const long double eps = 1e-9;
const int maxn = 3e5 + 5;
void precalc() {}
int a[3][maxn];
map<int, int> l[3], r[3];
inline bool present(int x, int y) { return l[x].count(y); }
inline int getL(int x, int y) {
  if (!present(x, y)) {
    return maxn;
  }
  return l[x][y];
}
vector<pair<int, int> > pairs;
int n, i, j;
int ans, best;
void ins(pair<int, int> a) {
  for (int i = 0; i < ((int)(pairs).size()); i++) {
    if (pairs[i].first < a.first && pairs[i].second > a.second) {
      return;
    }
  }
  pairs.push_back(a);
  sort((pairs).begin(), (pairs).end());
  pairs.resize(unique((pairs).begin(), (pairs).end()) - pairs.begin());
  best = 3 * n;
  int t = 0;
  for (int i = ((int)(pairs).size()) - 1; i >= 0; i--) {
    best = min(best, pairs[i].first + 1 + t + 1);
    t = max(t, pairs[i].second);
  }
}
void solve() {
  scanf("%d", &n);
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < n; j++) {
      scanf("%d", &a[i][j]);
      if (!l[i].count(a[i][j])) {
        l[i][a[i][j]] = j;
      }
    }
  }
  ans = 3 * n;
  for (int i = 0; i < n; i++) {
    if (!present(0, a[1][i])) {
      ins(make_pair(getL(1, a[1][i]), getL(2, a[1][i])));
    }
    if (!present(0, a[2][i])) {
      ins(make_pair(getL(1, a[2][i]), getL(2, a[2][i])));
    }
  }
  ins(make_pair(-1, maxn));
  ins(make_pair(maxn, -1));
  ans = min(ans, n + best);
  for (int i = n - 1; i >= 0; i--) {
    if (l[0][a[0][i]] == i) {
      ins(make_pair(getL(1, a[0][i]), getL(2, a[0][i])));
    }
    ans = min(ans, i + best);
  }
  printf("%d\n", ans);
}
int main() {
  srand(rdtsc());
  solve();
  return 0;
}
