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;
template <typename T, typename U>
inline void smin(T &a, U b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, U b) {
  if (a < b) a = b;
}
template <class T>
inline void gn(T &first) {
  char c, sg = 0;
  while (c = getchar(), (c > '9' || c < '0') && c != '-')
    ;
  for ((c == '-' ? sg = 1, c = getchar() : 0), first = 0; c >= '0' && c <= '9';
       c = getchar())
    first = (first << 1) + (first << 3) + c - '0';
  if (sg) first = -first;
}
template <class T>
inline void print(T first) {
  if (first < 0) {
    putchar('-');
    return print(-first);
  }
  if (first < 10) {
    putchar('0' + first);
    return;
  }
  print(first / 10);
  putchar(first % 10 + '0');
}
template <class T>
inline void println(T first) {
  print(first);
  putchar('\n');
}
int power(int a, int b, int m, int ans = 1) {
  for (; b; b >>= 1, a = 1LL * a * a % m)
    if (b & 1) ans = 1LL * ans * a % m;
  return ans;
}
int a[100111], b[100111], c[100111];
int n;
int arr[100111 << 2];
int nn;
int pos[3][100111 << 2];
inline int get(int a) { return upper_bound(arr, arr + nn, a) - arr; }
set<pair<int, int> > s;
multiset<int> val;
void disp(set<pair<int, int> >::iterator it) {
  cerr << it->first << ' ' << it->second << endl;
}
inline set<pair<int, int> >::iterator del(set<pair<int, int> >::iterator it) {
  auto pre = it, nxt = it;
  pre--;
  nxt++;
  val.erase(val.find(pre->first + it->second));
  val.erase(val.find(it->first + nxt->second));
  val.insert(pre->first + nxt->second);
  s.erase(it);
  return pre;
}
inline void add(int first, int second) {
  s.insert(pair<int, int>(first, second));
  auto it = s.lower_bound(pair<int, int>(first, second));
  auto pre = it, nxt = it;
  pre--;
  nxt++;
  val.insert(pre->first + it->second);
  val.insert(it->first + nxt->second);
  val.erase(val.find(pre->first + nxt->second));
}
inline void update(int u) {
  int first = pos[1][u], second = pos[2][u];
  auto it = s.upper_bound(pair<int, int>(first, second));
  if (it->second >= second) return;
  --it;
  while (it->second <= second) {
    it = del(it);
  }
  add(first, second);
}
int solve() {
  cin >> n;
  for (int i = 1; i <= n; i++) gn(a[i]), arr[nn++] = a[i];
  for (int i = 1; i <= n; i++) gn(b[i]), arr[nn++] = b[i];
  for (int i = 1; i <= n; i++) gn(c[i]), arr[nn++] = c[i];
  sort(arr, arr + nn);
  nn = unique(arr, arr + nn) - arr;
  memset(pos, 0x3f, sizeof pos);
  s.insert(pair<int, int>(0, 0x3f3f3f3f + 1));
  s.insert(pair<int, int>(0x3f3f3f3f + 1, 0));
  val.insert(0);
  for (int i = n; i >= 1; i--) {
    a[i] = get(a[i]);
    pos[0][a[i]] = i;
  }
  for (int i = n; i >= 1; i--) {
    b[i] = get(b[i]);
    pos[1][b[i]] = i;
  }
  for (int i = n; i >= 1; i--) {
    c[i] = get(c[i]);
    pos[2][c[i]] = i;
  }
  for (int i = 1; i <= nn; i++)
    if (pos[0][i] == 0x3f3f3f3f) add(pos[1][i], pos[2][i]);
  int ans = 0x3f3f3f3f;
  for (int i = n; i >= 0; i--) {
    smin(ans, *val.begin() + i);
    if (i and pos[0][a[i]] == i) update(a[i]);
  }
  cout << ans << endl;
}
int main() {
  solve();
  return 0;
}
