#include <bits/stdc++.h>
using namespace std;
template <class T>
void show(T *a, int n) {
  for (int i = 0; i < n; i++) cout << a[i] << "  ";
  puts("");
}
template <class T>
void queue_clear(T *a, int n) {
  for (int i = 0; i < n; i++) {
    while (!a->empty()) a->pop();
  }
}
const int MAXN = 107;
int fa[MAXN];
int nf[MAXN];
queue<int> q[MAXN];
int find(int x) {
  if (x == fa[x]) return x;
  return fa[x] = find(fa[x]);
}
int main() {
  int n, m;
  while (~scanf("%d%d", &n, &m)) {
    queue_clear(q, n + 1);
    int i, a, b;
    for (i = 1; i <= n; i++) {
      fa[i] = i;
      nf[i] = 1;
    }
    for (i = 1; i <= m; i++) {
      scanf("%d%d", &a, &b);
      a = find(a);
      b = find(b);
      if (a != b) {
        fa[a] = b;
        nf[b] += nf[a];
      }
    }
    for (i = 1; i <= n; i++) {
      a = find(i);
      q[a].push(i);
    }
    for (i = 1; i <= n; i++) {
      if (q[i].size() == 1) {
        q[0].push(q[i].front());
        q[i].pop();
      }
    }
    int bans = 1;
    for (i = 1; i <= n; i++) {
      if (q[i].size() == 0 || q[i].size() == 3) continue;
      if (q[i].size() > 3) {
        bans = 0;
        continue;
      } else {
        if (q[0].empty()) {
          bans = 0;
          break;
        }
        q[i].push(q[0].front());
        q[0].pop();
      }
    }
    if (!bans) {
      puts("-1");
      continue;
    }
    for (i = 1; i <= n; i++) {
      if (q[i].size() == 3) {
        while (!q[i].empty()) {
          printf("%d ", q[i].front());
          q[i].pop();
        }
        puts("");
      }
    }
    while (!q[0].empty()) {
      n = 3;
      while (n--) {
        printf("%d ", q[0].front());
        q[0].pop();
      }
      puts("");
    }
  }
  return 0;
}
