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;
bool debug = 1;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
long long ln, lk, lm;
int a[100005], b[100005], c[100005], ans;
map<int, int> mpb, mpc, mpa, inv;
set<int> sbc;
set<pair<int, int>> ss;
multiset<int> as;
void add(int pb, int pc) {
  auto it = ss.lower_bound({pb, -(1e8)});
  if ((*it).second >= pc) return;
  auto pre = it;
  pre--;
  as.erase(as.find((*pre).first + (*it).second));
  while ((*pre).second <= pc) {
    auto data = *pre;
    int y = data.second;
    pre--;
    as.erase(as.find(y + (*pre).first));
    ss.erase(data);
  }
  as.insert((*pre).first + pc);
  if ((*it).first == pb) {
    ss.erase(it);
  } else {
    as.insert(pb + (*it).second);
  }
  ss.insert({pb, pc});
}
int main() {
  scanf("%d", &n);
  for (int(i) = 1; (i) <= (int)(n); (i)++) scanf("%d", a + i);
  for (int(i) = 1; (i) <= (int)(n); (i)++) scanf("%d", b + i);
  for (int(i) = 1; (i) <= (int)(n); (i)++) scanf("%d", c + i);
  for (int i = n; i; i--) {
    mpb[b[i]] = i;
    mpc[c[i]] = i;
    mpa[a[i]] = i;
    sbc.insert(b[i]);
    sbc.insert(c[i]);
  }
  for (int(i) = 1; (i) <= (int)(n); (i)++) sbc.erase(a[i]);
  ss.insert({0, (1e8) * 10});
  ss.insert({(1e8) * 10, 0});
  as.insert(0);
  for (int x : sbc) {
    int pb = mpb.find(x) == mpb.end() ? (1e8) : mpb[x];
    int pc = mpc.find(x) == mpc.end() ? (1e8) : mpc[x];
    add(pb, pc);
  }
  ans = (1e8);
  for (int i = n; i >= 0; i--) {
    while (i && mpa[a[i]] != i) i--;
    int tmp = i + *as.begin();
    ans = min(ans, tmp);
    if (i) {
      int x = a[i];
      int pb = mpb.find(x) == mpb.end() ? (1e8) : mpb[x];
      int pc = mpc.find(x) == mpc.end() ? (1e8) : mpc[x];
      if (pb == (1e8) && pc == (1e8)) break;
      add(pb, pc);
    }
  }
  printf("%d\n", ans);
  return 0;
}