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;
template <typename T>
T abs(T x) {
  return x > 0 ? x : -x;
}
const int maxn = 100005;
const int inf = 1e9;
int tree[4 * maxn];
void modify(int v, int l, int r, int i, int val) {
  if (l == r) {
    tree[v] = val;
    return;
  }
  int c = (l + r) >> 1;
  if (i <= c)
    modify(2 * v, l, c, i, val);
  else
    modify(2 * v + 1, c + 1, r, i, val);
  tree[v] = max(tree[2 * v], tree[2 * v + 1]);
}
int get(int v, int l, int r, int i, int j) {
  if (i <= l && r <= j) return tree[v];
  int res = 0;
  int c = (l + r) >> 1;
  if (i <= c) res = max(res, get(2 * v, l, c, i, j));
  if (c < j) res = max(res, get(2 * v + 1, c + 1, r, i, j));
  return res;
}
int a[3][maxn];
map<int, int> rev[3];
int main(int argc, char *argv[]) {
  int n;
  scanf("%d", &n);
  set<int> s;
  for (int j = 0; j < 3; j++)
    for (int i = 1; i <= n; i++) {
      scanf("%d", &a[j][i]);
      if (rev[j].find(a[j][i]) == rev[j].end()) rev[j][a[j][i]] = i;
      s.insert(a[j][i]);
    }
  int ans = 0;
  for (int i = n; i >= 1; i--) {
    int x = a[0][i];
    if (rev[1].find(x) == rev[1].end() && rev[2].find(x) == rev[2].end()) {
      ans = i;
      break;
    }
  }
  multiset<int> f;
  f.insert(0);
  set<int> used;
  for (int x : s) {
    if (rev[0].find(x) != rev[0].end()) {
      if (rev[0][x] <= ans) {
        used.insert(x);
        continue;
      }
    }
    if (rev[1].find(x) == rev[1].end()) {
      f.insert(rev[2][x]);
    } else {
      if (rev[2].find(x) == rev[2].end())
        modify(1, 0, maxn - 1, rev[1][x], inf);
      else
        modify(1, 0, maxn - 1, rev[1][x], rev[2][x]);
    }
  }
  int ans2 = inf;
  for (int i = 0; i <= n; i++) {
    ans2 =
        min(ans2, i + max(get(1, 0, maxn - 1, i + 1, maxn - 1), *f.rbegin()));
  }
  int u = ans;
  ans = ans + ans2;
  for (int i = u + 1; i <= n; i++) {
    int x = a[0][i];
    if (used.count(x)) continue;
    used.insert(x);
    int pos;
    if (rev[1].find(x) == rev[1].end()) {
      pos = n + 1;
      f.erase(f.find(rev[2][x]));
    } else {
      pos = rev[1][x];
      modify(1, 0, maxn - 1, pos, 0);
    }
    int y = max(*f.rbegin(), get(1, 0, maxn - 1, pos, maxn - 1));
    int lo = 0, hi = pos;
    while (hi - lo > 1) {
      int mid = (hi + lo) >> 1;
      if (get(1, 0, maxn - 1, mid, pos) <= y)
        hi = mid;
      else
        lo = mid;
    }
    ans =
        min(ans, i + lo + max(get(1, 0, maxn - 1, hi, maxn - 1), *f.rbegin()));
  }
  cout << ans << endl;
  return 0;
}
