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 N = 100000 + 10, INF = N * 3 + 1;
int a[N], b[N], c[N], id[N * 3], L = 0;
int find(int x) {
  int l = 0, r = L;
  while (l + 1 < r) {
    int mid = (l + r) >> 1;
    if (id[mid] >= x)
      r = mid;
    else
      l = mid;
  }
  return r;
}
int n;
pair<int, int> poi[N * 3];
void init() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), id[++L] = a[i];
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]), id[++L] = b[i];
  for (int i = 1; i <= n; i++) scanf("%d", &c[i]), id[++L] = c[i];
  sort(id + 1, id + L + 1);
  L = unique(id + 1, id + L + 1) - (id + 1);
  for (int i = 1; i <= n; i++) a[i] = find(a[i]);
  for (int i = 1; i <= n; i++) b[i] = find(b[i]);
  for (int i = 1; i <= n; i++) c[i] = find(c[i]);
  for (int i = 1; i <= L; i++) poi[i] = make_pair(INF, INF);
  for (int i = 1; i <= n; i++)
    if (poi[b[i]].first == INF) poi[b[i]].first = i;
  for (int i = 1; i <= n; i++)
    if (poi[c[i]].second == INF) poi[c[i]].second = i;
}
int vis[N * 3], ans = INF * 3;
set<pair<int, int> > s;
priority_queue<pair<int, int> > ds;
int lf[N], rg[N], del[N * 7], L1 = 0;
void print() {
  for (set<pair<int, int> >::iterator it = s.begin(); it != s.end(); it++)
    cout << (*it).first << ' ' << (*it).second << endl;
  cout << endl;
}
void add(pair<int, int> a) {
  set<pair<int, int> >::iterator it = s.insert(a).first, r = it, l = it;
  r++, l--;
  if ((*r).second >= a.second) {
    s.erase(a);
    return;
  }
  while ((*l).second <= a.second) {
    del[rg[(*l).first]] = 1, del[lf[(*l).first]] = 1;
    s.erase(l);
    l = it, l--;
  }
  del[rg[(*l).first]] = 1;
  rg[(*l).first] = lf[a.first] = ++L1;
  ds.push(make_pair(-((*l).first + a.second), L1));
  del[lf[(*r).first]] = 1;
  rg[a.first] = lf[(*r).first] = ++L1;
  ds.push(make_pair(-(a.first + (*r).second), L1));
}
void calc(int i) {
  while ((!ds.empty()) && del[(ds.top()).second]) ds.pop();
  if (ds.empty()) {
    ans = ((ans) < (i) ? (ans) : (i));
    return;
  }
  pair<int, int> t = ds.top();
  ans = ((ans) < (-t.first + i) ? (ans) : (-t.first + i));
}
void work() {
  for (int i = 1; i <= L; i++) vis[i] = 0;
  for (int i = 1; i <= n; i++) vis[a[i]] = 1;
  s.clear();
  s.insert(make_pair(0, INF + 1)), s.insert(make_pair(INF + 1, 0));
  for (int i = 1; i <= L; i++)
    if (!vis[i]) add(poi[i]);
  for (int i = 1; i <= L; i++) vis[i] = 0;
  for (int i = 1; i <= n; i++)
    if (!vis[a[i]]) vis[a[i]] = i;
  for (int i = n; i >= 1; i--)
    if (vis[a[i]] == i) {
      calc(i);
      add(poi[a[i]]);
    }
  calc(0);
}
int main() {
  init();
  work();
  printf("%d\n", ans);
  return 0;
}