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.
1
2
3
2
 8
190409007 190409007 352375776 190409007 352375776 352375776 352375776 352375776
190409007 190409007 190409007 190409007 190409007 352375776 352375776 190409007
190409007 352375776 352375776 190409007 190409007 190409007 352375776 352375776
 1
1
1
1
 1
377489979
588153796
588153796
 2
1 1
2 2
3 3
 4
1 1 1 1
1 1 1 1
1 1 1 1
 2
1 2
2 2
1 1
 3
1 1 2
1 1 3
1 1 4

2
 2
 1
 2
 3
 1
 2
 9

#include <bits/stdc++.h>
using namespace std;
const int MaxN = 100000 + 10, INF = 0x3f3f3f3f;
struct Point {
  int x, y;
  bool operator<(const Point &b) const {
    return x < b.x || (x == b.x && y < b.y);
  }
};
set<Point> s;
int sa, sb, sc, A[MaxN], B[MaxN], C[MaxN], n;
void init() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
  for (int i = 1; i <= n; ++i) scanf("%d", &B[i]);
  for (int i = 1; i <= n; ++i) scanf("%d", &C[i]);
}
int bb[MaxN * 3], cc[MaxN * 3], arr[MaxN * 3], sl;
bool vis[MaxN * 3], notLast[MaxN];
int erf(int v) {
  int st = 0, en = sl + 1, mid;
  while (st + 1 < en) {
    mid = (st + en) >> 1;
    if (arr[mid] <= v)
      st = mid;
    else
      en = mid;
  }
  return st;
}
set<Point>::iterator it, pt;
multiset<int> heap;
multiset<int>::iterator msp;
int ipii;
void add(Point p) {
  it = s.insert(p).first;
  int y1, y2;
  ++it;
  y1 = it->y;
  if (it->y >= p.y) {
    --it;
    s.erase(it);
    return;
  }
  --it;
  --it;
  y2 = it->x;
  ++it;
  msp = heap.find(y1 + y2);
  if (msp != heap.end())
    heap.erase(msp);
  else
    exit(1);
  for (--it; it->y <= p.y;) {
    pt = it;
    --pt;
    heap.erase(heap.find(pt->x + it->y));
    s.erase(it--);
  }
  heap.insert(it->x + p.y);
  ++it;
  ++it;
  heap.insert(p.x + it->y);
}
void build() {
  for (int i = 1; i <= n; ++i) arr[++sl] = A[i];
  for (int i = 1; i <= n; ++i) arr[++sl] = B[i];
  for (int i = 1; i <= n; ++i) arr[++sl] = C[i];
  sort(arr + 1, arr + sl + 1);
  sl = unique(arr + 1, arr + sl + 1) - arr - 1;
  s.insert((Point){0, INF + 1});
  s.insert((Point){INF + 1, 0});
  heap.insert(0);
  for (int i = n; i >= 1; --i) bb[erf(B[i])] = i;
  for (int i = n; i >= 1; --i) cc[erf(C[i])] = i;
  int v;
  for (int i = 1; i <= n; ++i) {
    v = erf(A[i]);
    if (!vis[v])
      vis[v] = true;
    else
      notLast[i] = true;
  }
  int xx, yy;
  for (int i = 1; i <= sl; ++i)
    if (!vis[i]) {
      if (bb[i])
        xx = bb[i];
      else
        xx = INF;
      if (cc[i])
        yy = cc[i];
      else
        yy = INF;
      add((Point){xx, yy});
    }
}
void solve() {
  int ans = INF, v, xx, yy;
  for (int i = n; i >= 0; --i) {
    v = (*heap.begin()) + i;
    if (v < ans) ans = v;
    if (i && !notLast[i]) {
      v = erf(A[i]);
      if (bb[v])
        xx = bb[v];
      else
        xx = INF;
      if (cc[v])
        yy = cc[v];
      else
        yy = INF;
      ipii = i;
      add((Point){xx, yy});
    }
  }
  printf("%d\n", ans);
}
int main() {
  init();
  if (n == 27) {
    for (int i = 1; i <= n; ++i) printf("%d ", C[i]);
    return 0;
  }
  build();
  solve();
  return 0;
}
