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>
using namespace std;
const int MAXN = 1e5 + 10;
const int MAXV = 3 * MAXN;
const int INF = 0x01010101;
bool compx(pair<int, int> p1, pair<int, int> p2) {
  p1.second *= -1;
  p2.second *= -1;
  return p1 < p2;
}
bool compy(pair<int, int> p1, pair<int, int> p2) {
  return pair<int, int>(p1.second, -p1.first) <
         pair<int, int>(p2.second, -p2.first);
}
int N;
int A[3][MAXN];
int M;
vector<int> vals;
int fst[MAXV][3];
int ind[MAXV];
int main() {
  scanf("%d", &N);
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < N; j++) {
      scanf("%d", &A[i][j]);
      vals.push_back(A[i][j]);
    }
  }
  sort((vals).begin(), (vals).end());
  vals.resize(unique((vals).begin(), (vals).end()) - vals.begin());
  M = vals.size();
  for (int i = 0; i < M; i++) {
    for (int j = 0; j < 3; j++) {
      fst[i][j] = INF;
    }
  }
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < N; j++) {
      int &x = A[i][j];
      x = lower_bound((vals).begin(), (vals).end(), x) - vals.begin();
      fst[x][i] = min(fst[x][i], j + 1);
    }
  }
  iota(ind, ind + M + 1, 0);
  sort(ind, ind + M, [](int x, int y) { return fst[x][0] > fst[y][0]; });
  int ans = fst[ind[0]][0];
  set<pair<int, int> > st = {pair<int, int>(0, 2 * INF),
                             pair<int, int>(2 * INF, 0)};
  multiset<int> mst = {0};
  for (int i = 0; i < M; i++) {
    int x = fst[ind[i]][1], y = fst[ind[i]][2];
    set<pair<int, int> >::iterator lt, it,
        rt = st.lower_bound(pair<int, int>(x, y));
    assert(rt != st.end());
    if (rt->second < y) {
      it = st.insert(pair<int, int>(x, y)).first;
      lt = prev(it);
      mst.erase(mst.find(lt->first + rt->second));
      mst.insert(it->first + rt->second);
      while (lt->second < it->second) {
        rt = lt--;
        mst.erase(mst.find(lt->first + rt->second));
        st.erase(rt);
      }
      mst.insert(lt->first + it->second);
    }
    ans = min(ans, fst[ind[i + 1]][0] + *mst.begin());
  }
  printf("%d\n", ans);
}