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;
int n, b[3][((int)101 * 1000)], ans = ((int)1e9);
map<int, int> a[3];
set<pair<pair<int, int>, int> > s;
multiset<int> res;
void update(int id, int x) {
  auto it = s.upper_bound({{id, ((int)101 * 1000)}, 0});
  it--;
  int l = it->first.first, r = it->first.second, w = it->second;
  if (w > x) return;
  s.erase(it);
  res.erase(res.find(l + w));
  if (id != r) s.insert({{id + 1, r}, w}), res.insert(id + 1 + w);
  while (1) {
    it = s.upper_bound({{id, ((int)101 * 1000)}, 0});
    if (it == s.begin()) break;
    it--;
    if (it->second > x) break;
    res.erase(res.find(it->first.first + it->second));
    l = it->first.first;
    s.erase(it);
  }
  s.insert({{l, id}, x});
  res.insert(l + x);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int p = 0; p < 3; p++)
    for (int i = 1; i <= n; i++) {
      cin >> b[p][i];
      if (!a[p][b[p][i]]) a[p][b[p][i]] = i;
    }
  s.insert({{0, n}, 0});
  res.insert(0);
  for (auto u : a[1]) {
    int id0 = a[0][u.first], id2 = a[2][u.first];
    if (!id0 && !id2)
      update(u.second - 1, ((int)1e9));
    else if (!id0)
      update(u.second - 1, id2);
  }
  for (auto u : a[2]) {
    int id0 = a[0][u.first], id1 = a[1][u.first];
    if (!id0 && !id1) update(n, u.second);
  }
  for (int i = n; i >= 0; i--) {
    ans = min(ans, *res.begin() + i);
    if (a[0][b[0][i]] != i) continue;
    int id1 = a[1][b[0][i]], id2 = a[2][b[0][i]];
    if (!id1 && !id2) break;
    if (!id1)
      update(n, id2);
    else if (!id2)
      update(id1 - 1, ((int)1e9));
    else
      update(id1 - 1, id2);
  }
  cout << ans << "\n";
  return 0;
}