Problem: 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.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
using namespace std;
const long double eps = 1e-7;
const int inf = 10000010;
const long long INF = 10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 100010, LOG = 20;
int n, m, k, u, v, x, y, t, a, b, ans;
int A[3][MAXN];
int B[3][3 * MAXN];
int seg[MAXN << 2], lazy[MAXN << 2], Mn[MAXN << 2], Mx[MAXN << 2];
vector<int> compress;
set<pair<pair<int, int>, int> > st;
int build(int id, int tl, int tr) {
  if (tr - tl == 1) return seg[id] = tl;
  int mid = (tl + tr) >> 1;
  return seg[id] = min(build(id << 1, tl, mid), build(id << 1 | 1, mid, tr));
}
void add_lazy(int id, int val) {
  seg[id] += val;
  Mn[id] += val;
  Mx[id] += val;
  lazy[id] += val;
}
void shift(int id) {
  if (!lazy[id]) return;
  add_lazy(id << 1, lazy[id]);
  add_lazy(id << 1 | 1, lazy[id]);
  lazy[id] = 0;
}
void Add(int id, int tl, int tr, int l, int r, int val) {
  if (tr <= l || r <= tl) return;
  if (l <= tl && tr <= r) {
    add_lazy(id, val);
    return;
  }
  shift(id);
  int mid = (tl + tr) >> 1;
  Add(id << 1, tl, mid, l, r, val);
  Add(id << 1 | 1, mid, tr, l, r, val);
  seg[id] = min(seg[id << 1], seg[id << 1 | 1]);
  Mn[id] = min(Mn[id << 1], Mn[id << 1 | 1]);
  Mn[id] = max(Mx[id << 1], Mx[id << 1 | 1]);
}
int BS(int id, int tl, int tr, int val) {
  if (tr - tl == 1) return tl;
  shift(id);
  int mid = (tl + tr) >> 1;
  if (Mn[id << 1] >= val) return BS(id << 1 | 1, mid, tr, val);
  return BS(id << 1, tl, mid, val);
}
void split(int x) {
  pair<pair<int, int>, int> p = *--st.upper_bound({{x, inf}, 0});
  if (p.first.first == x) return;
  st.erase(p);
  st.insert({{p.first.first, x}, p.second});
  st.insert({{x, p.first.second}, p.second});
}
void update(int id, int tl, int tr, int l, int r, int val) {
  if (r <= tl || tr <= l || Mn[id] >= val) return;
  if (l <= tl && tr <= r && Mn[id] == Mx[id]) {
    add_lazy(id, val - Mx[id]);
    return;
  }
  shift(id);
  int mid = (tl + tr) >> 1;
  update(id << 1, tl, mid, l, r, val);
  update(id << 1 | 1, mid, tr, l, r, val);
  seg[id] = min(seg[id << 1], seg[id << 1 | 1]);
  Mn[id] = min(Mn[id << 1], Mn[id << 1 | 1]);
  Mx[id] = max(Mx[id << 1], Mx[id << 1 | 1]);
}
void print(int id, int tl, int tr) {
  if (tr - tl == 1) {
    cerr << seg[id] << ' ';
    return;
  }
  shift(id);
  int mid = (tl + tr) >> 1;
  print(id << 1, tl, mid);
  print(id << 1 | 1, mid, tr);
}
void Maximize(int l, int r, int val) { update(1, 0, n + 1, l, r, val); }
void Condition(int num) {
  if (!B[1][num] && B[2][num]) Maximize(0, n + 1, B[2][num]);
  if (B[1][num] && !B[2][num]) Maximize(0, B[1][num], inf);
  if (B[1][num] && B[2][num]) Maximize(0, B[1][num], B[2][num]);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int j = 0; j < 3; j++)
    for (int i = 1; i <= n; i++) cin >> A[j][i], compress.push_back(A[j][i]);
  sort(compress.begin(), compress.end());
  compress.resize(unique(compress.begin(), compress.end()) - compress.begin());
  for (int j = 0; j < 3; j++)
    for (int i = n; i; i--)
      B[j][A[j][i] = lower_bound(compress.begin(), compress.end(), A[j][i]) -
                     compress.begin()] = i;
  build(1, 0, n + 1);
  st.insert({{0, n + 1}, 0});
  for (int i = 0; i < compress.size(); i++)
    if (!B[0][i]) {
      if (!B[1][i] && !B[2][i]) continue;
      Condition(i);
    }
  ans = seg[1] + n;
  for (int i = n; i; i--) {
    int num = A[0][i];
    if (B[0][num] == i) {
      if (!B[1][num] && !B[2][num]) break;
      Condition(num);
    }
    ans = min(ans, seg[1] + i - 1);
  }
  cout << ans << '\n';
  return 0;
}