#include <bits/stdc++.h>
using namespace std;
int N = 1 << 22;
void USUN(int &actual, vector<set<int> > &V, map<int, int> &M,
          map<int, int> &L) {
  int a = N / 2;
  for (int i = N / 2; i <= N / 2 + actual; i++) {
    a = i;
    while (a > 0) {
      V[a].clear();
      a /= 2;
    }
  }
  M.clear();
  L.clear();
  actual = 0;
}
void Insert(int a, int b, int c, vector<set<int> > &V) {
  a += N / 2;
  b += N / 2;
  while (a <= b) {
    if (a % 2 == 1) {
      V[a].insert(c);
      a++;
    }
    if (b % 2 == 0) {
      V[b].insert(c);
      b--;
    }
    a /= 2;
    b /= 2;
  }
}
int query(int a, int b, vector<set<int> > &V) {
  a += N / 2;
  while (a > 0) {
    for (auto i = V[a].begin(); i != V[a].end(); ++i)
      if (*i != b) return *i;
    a /= 2;
  }
  return -1;
}
void policz(int a, map<int, int> &L, map<int, int> &M, vector<set<int> > &V,
            vector<int> &odp, int &actual) {
  L[a]++;
  if (L[a] == 4) {
    odp.push_back(a);
    odp.push_back(a);
    odp.push_back(a);
    odp.push_back(a);
    M.clear();
    L.clear();
    int ss = actual;
    actual = 0;
    USUN(ss, V, M, L);
  } else if (L[a] == 1) {
    M[a] = actual;
    actual++;
  } else if (L[a] > 0) {
    int b = M[a];
    Insert(b, actual, a, V);
    int c = query(b, a, V);
    actual++;
    if (c != -1) {
      odp.push_back(c);
      odp.push_back(a);
      odp.push_back(c);
      odp.push_back(a);
      M.clear();
      L.clear();
      int ss = actual;
      actual = 0;
      USUN(ss, V, M, L);
    }
  }
}
int main() {
  map<int, int> M, L;
  vector<set<int> > V;
  V.resize(1 << 22);
  vector<int> v;
  int n;
  cin >> n;
  int actual = 0;
  for (int i = 0; i < n; ++i) {
    int t;
    cin >> t;
    policz(t, L, M, V, v, actual);
  }
  cout << v.size() << endl;
  for (auto i = v.begin(); i != v.end(); ++i) cout << *i << " ";
}
