#include <bits/stdc++.h>
using namespace std;
vector<int> no[50];
vector<int> t[16];
vector<int> l;
bool f[50] = {0};
int c, k;
void dfs(int u) {
  int i;
  if (!f[u]) {
    f[u] = 1;
    ++c;
    t[k].push_back(u);
    if (c > 3) return;
    for (i = 0; i < no[u].size(); ++i) {
      dfs(no[u][i]);
      if (c > 3) return;
    }
  }
  return;
}
bool check(int n) {
  int i;
  k = 0;
  for (i = 1; i <= n; ++i) {
    if (f[i] == false && no[i].size() != 0) {
      c = 0;
      dfs(i);
      if (c > 3) return false;
      ++k;
    } else if (f[i] == false && no[i].size() == 0)
      l.push_back(i);
  }
  return true;
}
int main() {
  int n, m, i, j, u, v, flag = 1;
  scanf("%d %d", &n, &m);
  if (m == 0) {
    for (i = 1; i <= n; ++i) {
      printf("%d ", i);
      if (i % 3 == 0) printf("\n");
    }
  } else {
    for (i = 0; i < m; ++i) {
      scanf("%d %d", &u, &v);
      no[u].push_back(v);
    }
    if (!check(n))
      printf("-1\n");
    else {
      if (k > n / 3)
        flag = 0;
      else if (l.size() != 0) {
        flag = 1;
        j = 0;
        for (i = 0; i < k; ++i) {
          if (t[i].size() == 1) {
            t[i].push_back(l[j]);
            t[i].push_back(l[j + 1]);
            j += 2;
          } else if (t[i].size() == 2) {
            t[i].push_back(l[j]);
            ++j;
          }
        }
        if (j != l.size()) {
          while (j != l.size()) {
            t[k].push_back(l[j]);
            t[k].push_back(l[j + 1]);
            t[k].push_back(l[j + 2]);
            j += 3;
            ++k;
          }
        }
      }
      if (flag) {
        for (i = 0; i < k; ++i) {
          for (j = 0; j < 3; ++j) printf("%d ", t[i][j]);
          printf("\n");
        }
      } else
        printf("-1\n");
    }
  }
  return 0;
}
