#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[] = {1, 1, 0, -1, -1, -1, 0, 1};
struct sort_pair {
  bool operator()(pair<int, int> left, pair<int, int> right) {
    if (left.first < right.first) return false;
    if (right.first < left.first) return true;
    return right.second > left.second;
  }
};
char g[111][111];
bool vis[111][111];
int num;
int n, m, l;
int s, a = 0;
void DFS(int x, int y) {
  vis[x][y] = true;
  l++;
  for (int i = 0; i < 8; i += 2) {
    int nx = x + dx[i];
    int ny = y + dy[i];
    if (!vis[nx][ny] && nx >= 0 && ny >= 0 && nx < a && ny < s &&
        g[nx][ny] == '0')
      DFS(nx, ny);
  }
}
int main() {
  int num, in;
  cin >> num;
  map<int, int> data;
  map<int, int>::iterator it;
  while (num--) {
    cin >> in;
    data[in]++;
  }
  priority_queue<pair<int, int> > q;
  for (it = data.begin(); it != data.end(); it++) {
    q.push(make_pair(it->second, it->first));
  }
  vector<vector<int> > sol;
  while (q.size() >= 3) {
    vector<pair<int, int> > temp;
    for (long long i = 0; i < 3; i++) {
      temp.push_back(q.top());
      q.pop();
    }
    sol.push_back(vector<int>());
    for (long long i = 0; i < 3; i++) {
      sol.back().push_back(temp[i].second);
      temp[i].first--;
      if (temp[i].first > 0) q.push(temp[i]);
    }
  }
  cout << sol.size() << endl;
  for (long long i = 0; i < sol.size(); i++) {
    sort(sol[i].begin(), sol[i].end());
    reverse(sol[i].begin(), sol[i].end());
    for (long long j = 0; j < sol[i].size(); j++) {
      cout << sol[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}
