#include <bits/stdc++.h>
using namespace std;
int n, r, R, k, l, A[100005];
string cad, aux;
char x, y;
map<int, int> M;
struct Res {
  int X, Y, Z;
  Res() {}
  Res(int a, int b, int c) {
    int F[5];
    F[0] = a;
    F[1] = b;
    F[2] = c;
    sort(F, F + 3);
    X = F[2];
    Y = F[1];
    Z = F[0];
  }
};
vector<Res> Sol;
struct node {
  int elem, prio;
  node() {}
  node(int e, int p) {
    elem = e;
    prio = p;
  }
  bool operator<(const node &b) const {
    if (prio != b.prio) return prio < b.prio;
    return elem < b.elem;
  }
};
priority_queue<node> q;
void calc() {
  node n1, n2, n3;
  int r;
  Sol.clear();
  while (1) {
    if (q.empty()) return;
    n1 = q.top();
    q.pop();
    if (q.empty()) return;
    n2 = q.top();
    q.pop();
    if (q.empty()) return;
    n3 = q.top();
    q.pop();
    r = 1;
    for (int i = 0; i < r; i++) {
      Sol.push_back(Res(n1.elem, n2.elem, n3.elem));
    }
    if (r != n1.prio) q.push(node(n1.elem, n1.prio - r));
    if (r != n2.prio) q.push(node(n2.elem, n2.prio - r));
    if (r != n3.prio) q.push(node(n3.elem, n3.prio - r));
  }
}
int main() {
  scanf("%d", &n);
  M.clear();
  for (int i = 0; i < n; i++) {
    scanf("%d", &A[i]);
  }
  sort(A, A + n);
  int c = 1;
  for (int i = 1; i < n; i++)
    if (A[i] != A[i - 1]) {
      q.push(node(A[i - 1], c));
      c = 1;
    } else
      c++;
  q.push(node(A[n - 1], c));
  calc();
  cout << Sol.size() << endl;
  for (int i = 0; i < Sol.size(); i++)
    cout << Sol[i].X << " " << Sol[i].Y << " " << Sol[i].Z << endl;
  return 0;
}
