#include <bits/stdc++.h>
using namespace std;
const int maxn = 1205;
const int mod = 1e9 + 7;
long long qpow(long long a, long long b) {
  long long ans = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) ans = ans * a % mod;
    a = a * a % mod;
  }
  return ans;
}
long long gcd(long long a, long long b) { return b > 0 ? gcd(b, a % b) : a; }
int n, m, T;
int a[maxn], b[maxn];
int dp[maxn][maxn];
list<pair<int, int>> st;
vector<pair<int, pair<int, int>>> ans;
int main() {
  scanf("%d", &n);
  for (int temp = 453, i = 1; i <= 3 * n; i++) {
    scanf("%d", &temp);
    a[temp] = 1;
  }
  n *= 6;
  for (int i = 1; i <= n; i++) dp[i][i] = 0;
  for (int l = 3; l <= n; l += 3) {
    for (int i = 1; i + l - 1 <= n; i++) {
      for (int j = i; j <= i + l - 1; j++) {
        if (dp[i][j] && dp[j + 1][i + l - 1]) dp[i][i + l - 1] = j;
      }
      if (a[i] != a[i + l - 1]) continue;
      if (dp[i][i + l - 1]) continue;
      for (int j = i + 1; j <= i + l - 1 - 1; j++) {
        if (a[j] != a[i]) continue;
        if ((j - i == 1 || dp[i + 1][j - 1]) &&
            (i + l - 1 - j == 1 || dp[j + 1][i + l - 1 - 1])) {
          dp[i][i + l - 1] = -j;
        }
      }
    }
  }
  st.push_back({1, n});
  list<pair<int, int>>::iterator it;
  int turn = (n / 3) & 1;
  while (st.size()) {
    bool flag = 0;
    for (it = st.begin(); it != st.end(); it++) {
      if (it->first == it->second) {
        st.erase(it);
        flag = 1;
        break;
      }
    }
    if (flag) continue;
    for (it = st.begin(); it != st.end(); it++) {
      int l = it->first;
      int r = it->second;
      if (dp[l][r] > 0) {
        int mid = dp[l][r];
        it = st.erase(it);
        if (dp[l][mid]) st.push_back({l, mid});
        if (dp[mid + 1][r]) st.push_back({mid + 1, r});
        flag = 1;
        break;
      }
    }
    if (flag) continue;
    for (it = st.begin(); it != st.end(); it++) {
      int l = it->first;
      int r = it->second;
      if (dp[l][r] < 0 && r - l + 1 > 3 && a[l] == turn) {
        int mid = -dp[l][r];
        it = st.erase(it);
        ans.push_back(make_pair(l, make_pair(mid, r)));
        if (l + 1 < mid - 1) st.push_back({l + 1, mid - 1});
        if (mid + 1 < r - 1) st.push_back({mid + 1, r - 1});
        turn ^= 1;
        flag = 1;
        break;
      }
    }
    if (flag) continue;
    for (it = st.begin(); it != st.end(); it++) {
      int l = it->first;
      int r = it->second;
      if (dp[l][r] < 0 && a[l] == turn) {
        int mid = -dp[l][r];
        it = st.erase(it);
        ans.push_back(make_pair(l, make_pair(mid, r)));
        if (l + 1 < mid - 1) st.push_back({l + 1, mid - 1});
        if (mid + 1 < r - 1) st.push_back({mid + 1, r - 1});
        turn ^= 1;
        flag = 1;
        break;
      }
    }
    if (flag == 0) {
      break;
    }
  }
  reverse((ans).begin(), (ans).end());
  for (auto p : ans) {
    printf("%d %d %d\n", p.first, p.second.first, p.second.second);
  }
  return 0;
}
