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 INF = 1e7;
const int MN = 1e5 + 7;
struct int3 {
  int a[3];
  bool operator<(const int3 &x) const { return a[0] < x.a[0]; }
} ept = {INF, INF, INF};
int n, t, ans = INF;
int3 f[MN * 3];
map<int, int3> mp;
map<int, int3>::iterator mi;
set<pair<int, int> > u;
set<pair<int, int> >::iterator ui, ii;
multiset<int> res;
void gao(int x, int y) {
  ui = u.upper_bound(pair<int, int>(x, y));
  if (ui->second >= y) return;
  pair<int, int> pre = *ui;
  ii = ui;
  ii--;
  while (ii->second <= y) {
    res.erase(res.find(ii->first + pre.second));
    pre = *ii;
    ii--;
    u.erase(pre);
  }
  res.erase(res.find(ii->first + pre.second));
  res.insert(ii->first + y);
  res.insert(x + ui->second);
  u.insert(pair<int, int>(x, y));
}
int main() {
  scanf("%d", &n);
  int i, j, k;
  for (i = 0; i < 3; i++) {
    for (j = 1; j <= n; j++) {
      scanf("%d", &k);
      if (mp.find(k) == mp.end()) mp[k] = ept;
      mp[k].a[i] = min(mp[k].a[i], j);
    }
  }
  for (mi = mp.begin(); mi != mp.end(); mi++) f[t++] = mi->second;
  sort(f, f + t);
  u.insert(pair<int, int>(0, INF * 2));
  u.insert(pair<int, int>(INF * 2, 0));
  res.insert(0);
  k = INF;
  for (i = t - 1; i >= 0; i--) {
    ans = min(ans, *res.begin() + f[i].a[0]);
    gao(f[i].a[1], f[i].a[2]);
  }
  ans = min(ans, *res.begin() + f[i].a[0]);
  printf("%d\n", ans);
  return 0;
}