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, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const 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 T1, class T2>
inline void gn(T1 &x1, T2 &x2) {
  gn(x1), gn(x2);
}
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;
}
vector<pair<int, int> > vec[300300];
int main() {
  int n;
  cin >> n;
  map<int, int> all;
  map<int, int> pos[3];
  for (int i = 0; i < 3; i++)
    for (int j = 1; j <= n; j++) {
      int first;
      gn(first);
      all[first] = 1;
      if (!pos[i].count(first)) pos[i][first] = j;
    }
  for (auto p : all) {
    int first = p.first;
    vec[pos[0].count(first) ? pos[0][first] : 300300 - 1].push_back(
        pair<int, int>(pos[1].count(first) ? pos[1][first] : 300300,
                       pos[2].count(first) ? pos[2][first] : 300300));
  }
  int ans = 300300;
  multiset<int> s;
  set<pair<int, int> > point;
  point.insert(pair<int, int>(300300 + 1, 0));
  point.insert(pair<int, int>(0, 300300 + 1));
  s.insert(0);
  for (int i = 300300; --i;) {
    for (pair<int, int> p : vec[i]) {
      auto it = point.lower_bound(p);
      if (it->second >= p.second) continue;
      while (1) {
        auto pre = it;
        pre--;
        s.erase(s.find(it->second + pre->first));
        if (pre->second > p.second) break;
        it = pre;
      }
      it = point.lower_bound(p);
      it--;
      while (it->second <= p.second) {
        auto pre = it;
        pre--;
        point.erase(it);
        it = pre;
      }
      it = point.insert(p).first;
      auto nxt = it, pre = it;
      nxt++;
      pre--;
      s.insert(pre->first + it->second);
      s.insert(it->first + nxt->second);
    }
    smin(ans, i - 1 + *s.begin());
  }
  cout << ans << endl;
  return 0;
}
