#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  long long r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
const int mod = 1000000007;
const int INF = (int)1e9;
const long long LINF = (long long)1e18;
const long double PI = 2 * acos(0);
const int maxn = 500010;
int n;
int a[maxn];
map<int, vector<int> > g;
int nxt[maxn];
int prv[maxn];
int st[4 * maxn];
void build(int node, int L, int R) {
  if (L == R) {
    st[node] = prv[L];
    return;
  }
  build(node << 1, L, (L + R) >> 1);
  build((node << 1) + 1, ((L + R) >> 1) + 1, R);
  st[node] = min(st[node << 1], st[(node << 1) + 1]);
}
int query(int node, int l, int r, int L, int R) {
  if (l > R || r < L) return INF;
  if (l <= L && r >= R) return st[node];
  return min(query(node << 1, l, r, L, (L + R) >> 1),
             query((node << 1) + 1, l, r, ((L + R) >> 1) + 1, R));
}
void update(int node, int i, int L, int R) {
  if (i < L || i > R) return;
  if (L == R) {
    st[node] = INF;
    return;
  }
  update(node << 1, i, L, (L + R) >> 1);
  update((node << 1) + 1, i, ((L + R) >> 1) + 1, R);
  st[node] = min(st[node << 1], st[(node << 1) + 1]);
}
void solve() {
  memset(nxt, -1, sizeof(nxt));
  memset(prv, 0x3f, sizeof(prv));
  scanf("%d", &n);
  for (int i = (0); i < (n); i++) {
    scanf("%d", a + i);
    g[a[i]].push_back(i);
  }
  for (map<int, vector<int> >::iterator it = g.begin(); it != g.end(); it++) {
    vector<int> tmp = it->second;
    for (int i = (0); i < (int((tmp).size()) - 1); i++) {
      nxt[tmp[i]] = tmp[i + 1];
      prv[tmp[i + 1]] = tmp[i];
    }
  }
  build(1, 0, n - 1);
  vector<int> ans;
  int last = 0, cur = 0;
  while (cur < n) {
    if (prv[cur] >= n || prv[cur] < last) {
      cur++;
      continue;
    }
    if (query(1, prv[cur] + 1, cur - 1, 0, n - 1) < prv[cur]) {
      for (int i = (prv[cur] + 1); i < (cur); i++)
        if (prv[i] < prv[cur]) {
          ans.push_back(a[prv[i]]);
          ans.push_back(a[prv[cur]]);
          ans.push_back(a[i]);
          ans.push_back(a[cur]);
          break;
        }
      for (int i = (last); i < (cur + 1); i++) {
        if (nxt[i] != -1) {
          update(1, nxt[i], 0, n - 1);
          prv[nxt[i]] = INF;
        }
      }
      last = cur + 1;
    } else if (prv[cur] < n && prv[cur] >= last && prv[prv[cur]] < n &&
               prv[prv[cur]] >= last && prv[prv[prv[cur]]] < n &&
               prv[prv[prv[cur]]] >= last) {
      ans.push_back(a[prv[prv[prv[cur]]]]);
      ans.push_back(a[prv[prv[cur]]]);
      ans.push_back(a[prv[cur]]);
      ans.push_back(a[cur]);
      for (int i = (last); i < (cur + 1); i++) {
        if (nxt[i] != -1) {
          update(1, nxt[i], 0, n - 1);
          prv[nxt[i]] = INF;
        }
      }
      last = cur + 1;
    }
    cur++;
  }
  printf("%d\n", int((ans).size()));
  for (int i = (0); i < (int((ans).size())); i++) printf("%d ", ans[i]);
}
int main() {
  solve();
  return 0;
}
