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;
int n, a[3][100010], tot, tt, ans, rec, b[100010 << 2];
struct Num {
  int x, y, val;
  void init(int xx, int yy) {
    x = xx, y = yy;
    scanf("%d", &val);
  }
} t[100010 << 2];
bool cmp(Num _, Num __) { return _.val < __.val; }
int calc(int i) {
  int res = 3 * n;
  for (int j = 1; j <= i; j++) {
    if (b[a[0][j]] == 0) tot++;
    b[a[0][j]]++;
  }
  for (int j = 1; j <= n; j++) {
    if (b[a[2][j]] == 0) tot++;
    b[a[2][j]]++;
  }
  int t = n;
  for (int j = 0; j <= n; j++) {
    if (j != 0) {
      if (b[a[1][j]] == 0) tot++;
      b[a[1][j]]++;
    }
    if (tot == rec) res = min(res, i + j + t);
    while (tot == rec && t > 0) {
      if (b[a[2][t]] == 1) tot--;
      b[a[2][t]]--;
      t--;
    }
    if (tot != rec) {
      if (t < n) {
        t++;
        if (b[a[2][t]] == 0) tot++;
        b[a[2][t]]++;
      }
      if (tot == rec) res = min(res, i + j + t);
    } else
      res = min(res, i + j + t);
  }
  tot = 0;
  for (int i = 0; i <= rec; i++) b[i] = 0;
  return res;
}
int main() {
  scanf("%d", &n);
  ans = 3 * n;
  for (int j = 0; j < 3; j++)
    for (int i = 1; i <= n; i++) t[++tt].init(j, i);
  sort(t + 1, t + tt + 1, cmp);
  int tmp = -1;
  rec = 0;
  for (int i = 1; i <= tt; i++) {
    if (t[i].val > tmp) {
      tmp = t[i].val;
      rec++;
    }
    a[t[i].x][t[i].y] = rec;
  }
  if (n <= 2000) {
    for (int i = 0; i <= n; i++) {
      ans = min(ans, calc(i));
    }
    printf("%d\n", ans);
    return 0;
  } else {
    int ll = 0, rr = n;
    while (ll < rr) {
      int mid = (ll + rr) >> 1;
      if (calc(mid) < 3 * n)
        rr = mid;
      else
        ll = mid + 1;
    }
    int l = ll, r = n;
    while (r - l > 1) {
      int x1 = (l + r) >> 1, x2 = (x1 + r) >> 1;
      int v1 = calc(x1), v2 = calc(x2);
      if (v1 < v2)
        r = x2;
      else
        l = x1;
    }
    for (int i = max(0, l - 100); i <= min(n, l + 100); i++)
      ans = min(ans, calc(i));
    printf("%d\n", ans);
  }
  return 0;
}
