#include <bits/stdc++.h>
using namespace std;
const double PI = 2 * asin(1.0);
const int INF = 1000000000;
const double EPS = 1e-10;
inline int cmp(double x, double y = 0, double tol = EPS) {
  return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1;
}
inline long long gcd(long long n1, long long n2) {
  return n2 == 0 ? abs(n1) : gcd(n2, n1 % n2);
}
inline long long lcm(long long n1, long long n2) {
  return n1 == 0 || n2 == 0 ? 0 : abs(n1 * (n2 / gcd(n1, n2)));
}
map<int, int> mapi;
bool comp(pair<int, int> p1, pair<int, int> p2) {
  return p1.second > p2.second;
}
class mycomparison {
  bool reverse;

 public:
  mycomparison(const bool& revparam = false) { reverse = revparam; }
  bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) const {
    if (reverse)
      return (lhs.second < rhs.second);
    else
      return (lhs.second > rhs.second);
  }
};
int main() {
  int n, x;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> x;
    mapi[x]++;
  }
  priority_queue<pair<int, int>, vector<pair<int, int> >, mycomparison> pq(
      true);
  for (map<int, int>::iterator it = mapi.begin(); it != mapi.end(); it++) {
    pair<int, int> p;
    p.first = it->first;
    p.second = it->second;
    pq.push(p);
  }
  int idx = 0, idy = 1, idz = 2;
  vector<int> res;
  while (pq.size() > 2) {
    pair<int, int> p1 = pq.top();
    pq.pop();
    pair<int, int> p2 = pq.top();
    pq.pop();
    pair<int, int> p3 = pq.top();
    pq.pop();
    p1.second--;
    p2.second--;
    p3.second--;
    res.push_back(p1.first);
    res.push_back(p2.first);
    res.push_back(p3.first);
    if (p1.second) pq.push(p1);
    if (p2.second) pq.push(p2);
    if (p3.second) pq.push(p3);
  }
  cout << (int((res).size()) / 3) << endl;
  for (int i = 0; i < int((res).size()); ++i) {
    sort(res.begin() + i, res.begin() + i + 3);
    cout << res[i + 2] << " " << res[i + 1] << " " << res[i] << endl;
    i += 2;
  }
}
