#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
inline long long rand(long long x, long long y) {
  return rng() % (y + 1 - x) + x;
}
string inline to_string(char c) {
  string second(1, c);
  return second;
}
template <typename T>
inline T gcd(T a, T b) {
  return a == 0 ? llabs(b) : gcd(b % a, a);
}
using ll = long long;
using ld = long double;
using pi = pair<ll, ll>;
using spi = pair<ll, pi>;
using dpi = pair<pi, pi>;
long long LLINF = 1e18;
int INF = 1e9 + 1e6;
ll n, a, co, sz[(406)], p[(406)], deg[(406)], cnt;
bitset<(406) * 3> F;
bitset<(406)> out, isroot;
stack<pi> stk;
vector<ll> order, who[(406)];
ll belong(ll x) { return F[who[x][0]]; }
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (ll i = 1; i <= ll(3 * n); ++i) cin >> a, F[a] = 1;
  for (ll i = 1; i <= ll(6 * n); ++i) {
    if (stk.size() && stk.top().second == F[i]) {
      ++sz[stk.top().first], who[stk.top().first].emplace_back(i);
      if (sz[stk.top().first] == 3) {
        stk.pop();
      }
    } else {
      ++co;
      if (stk.empty()) {
        p[co] = -1;
        if (F[i] == 0) isroot[co] = 1, ++cnt;
      } else {
        ++deg[stk.top().first];
        p[co] = stk.top().first;
      }
      sz[co] = 1, who[co].emplace_back(i);
      stk.emplace(co, F[i]);
    }
  }
  assert(co == 2 * n);
  for (ll i = 1; i <= ll(co); ++i) {
    ll leaf = -1;
    for (ll j = 1; j <= ll(co); ++j)
      if (!out[j] && deg[j] == 0 && belong(j) == i % 2) {
        if (isroot[j] && cnt == 1) {
          continue;
        }
        leaf = j;
        break;
      }
    if (leaf == -1) {
      assert(i == co);
      for (ll i = 1; i <= ll(co); ++i)
        if (!out[i]) leaf = i;
    }
    for (auto j : who[leaf]) {
      cout << j << ' ';
    }
    cout << '\n';
    cnt -= isroot[leaf];
    if (~p[leaf]) --deg[p[leaf]];
    out[leaf] = 1;
  }
}
