#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
struct xy {
int x, y;
bool operator <(const xy a)const {
if (a.x == x)return a.y < y;
return a.x > x;
}
};
priority_queue<xy>Q;
int a[212121];
vector<int>ansx;
vector<int>ansy;
vector<int>ansz;
int main() {
int n;
int ans = 0;
scanf("%d", &n);
int i;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
int cnt = 1;
int now = a[0];
for (i = 1; i < n; i++) {
if (a[i] == a[i - 1]) {
cnt++;
}
else {
Q.push({ cnt,now });
cnt = 1;
now = a[i];
}
}
Q.push({ cnt,now });
while (Q.size() >= 3) {
xy t1 = Q.top();
Q.pop();
xy t2 = Q.top();
Q.pop();
xy t3 = Q.top();
Q.pop();
t1.x--;
t2.x--;
t3.x--;
if (t1.x>0)Q.push(t1);
if (t2.x>0)Q.push(t2);
if (t3.x>0)Q.push(t3);
ans++;
ansx.push_back(t1.y);
ansy.push_back(t2.y);
ansz.push_back(t3.y);
}
printf("%d\n", ans);
for (i = 0; i < ansx.size(); i++) {
int temp[3];
temp[0] = ansx[i];
temp[1] = ansy[i];
temp[2] = ansz[i];
sort(temp, temp + 3);
printf("%d %d %d\n", temp[2], temp[1], temp[0]);
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpzdHJ1Y3QgeHkgewoJaW50IHgsIHk7Cglib29sIG9wZXJhdG9yIDwoY29uc3QgeHkgYSljb25zdCB7CgkJaWYgKGEueCA9PSB4KXJldHVybiBhLnkgPCB5OwoJCXJldHVybiBhLnggPiB4OwoJfQp9Owpwcmlvcml0eV9xdWV1ZTx4eT5ROwppbnQgYVsyMTIxMjFdOwp2ZWN0b3I8aW50PmFuc3g7CnZlY3RvcjxpbnQ+YW5zeTsKdmVjdG9yPGludD5hbnN6OwoKaW50IG1haW4oKSB7CglpbnQgbjsKCWludCBhbnMgPSAwOwoJc2NhbmYoIiVkIiwgJm4pOwoJaW50IGk7Cglmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJc2NhbmYoIiVkIiwgJmFbaV0pOwoJfQoJc29ydChhLCBhICsgbik7CglpbnQgY250ID0gMTsKCWludCBub3cgPSBhWzBdOwoJZm9yIChpID0gMTsgaSA8IG47IGkrKykgewoJCWlmIChhW2ldID09IGFbaSAtIDFdKSB7CgkJCWNudCsrOwoJCX0KCQllbHNlIHsKCQkJUS5wdXNoKHsgY250LG5vdyB9KTsKCQkJY250ID0gMTsKCQkJbm93ID0gYVtpXTsKCQl9Cgl9CglRLnB1c2goeyBjbnQsbm93IH0pOwoJd2hpbGUgKFEuc2l6ZSgpID49IDMpIHsKCQl4eSB0MSA9IFEudG9wKCk7CgkJUS5wb3AoKTsKCQl4eSB0MiA9IFEudG9wKCk7CgkJUS5wb3AoKTsKCQl4eSB0MyA9IFEudG9wKCk7CgkJUS5wb3AoKTsKCQl0MS54LS07CgkJdDIueC0tOwoJCXQzLngtLTsKCQlpZiAodDEueD4wKVEucHVzaCh0MSk7CgkJaWYgKHQyLng+MClRLnB1c2godDIpOwoJCWlmICh0My54PjApUS5wdXNoKHQzKTsKCQlhbnMrKzsKCQlhbnN4LnB1c2hfYmFjayh0MS55KTsKCQlhbnN5LnB1c2hfYmFjayh0Mi55KTsKCQlhbnN6LnB1c2hfYmFjayh0My55KTsKCX0KCXByaW50ZigiJWRcbiIsIGFucyk7Cglmb3IgKGkgPSAwOyBpIDwgYW5zeC5zaXplKCk7IGkrKykgewoJCWludCB0ZW1wWzNdOwoJCXRlbXBbMF0gPSBhbnN4W2ldOwoJCXRlbXBbMV0gPSBhbnN5W2ldOwoJCXRlbXBbMl0gPSBhbnN6W2ldOwoJCXNvcnQodGVtcCwgdGVtcCArIDMpOwoJCXByaW50ZigiJWQgJWQgJWRcbiIsIHRlbXBbMl0sIHRlbXBbMV0sIHRlbXBbMF0pOwoJfQoJcmV0dXJuIDA7Cn0=