#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  register int x = 0;
  register char c = getchar();
  bool f = 0;
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  if (c == '-') c = getchar(), f = 1;
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return f ? -x : x;
}
const int N = 100010;
int b[N], a[N], c[N];
int ans[N][3], cnt;
priority_queue<pair<int, int> > q;
int main() {
  int n = gi();
  for (int i = 1; i <= n; i++) b[i] = a[i] = gi();
  sort(b + 1, b + 1 + n);
  int m = unique(b + 1, b + 1 + n) - b - 1;
  for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + 1 + m, a[i]) - b;
  for (int i = 1; i <= n; i++) c[a[i]]++;
  for (int i = 1; i <= m; i++) q.push(make_pair(c[i], b[i]));
  while (q.size() > 2) {
    pair<int, int> x = q.top();
    q.pop();
    pair<int, int> y = q.top();
    q.pop();
    pair<int, int> z = q.top();
    q.pop();
    x.first--;
    y.first--;
    z.first--;
    if (x.first) q.push(x);
    if (y.first) q.push(y);
    if (z.first) q.push(z);
    if (x.second < y.second) swap(x, y);
    if (x.second < z.second) swap(x, z);
    if (y.second < z.second) swap(y, z);
    ans[++cnt][0] = x.second;
    ans[cnt][1] = y.second;
    ans[cnt][2] = z.second;
  }
  printf("%d\n", cnt);
  for (int i = 1; i <= cnt; i++)
    printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
  return 0;
}
