#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 48 + 10;
vector<int> adj[MAX_N];
vector<int> ziro;
bool mark[MAX_N];
int ans[MAX_N][3];
int poi = 0;
vector<int> dfs(int v) {
  vector<int> ret;
  ret.push_back(v);
  mark[v] = 1;
  for (auto i : adj[v])
    if (!mark[i]) {
      vector<int> vec = dfs(i);
      while (vec.size()) {
        ret.push_back(vec.back());
        vec.pop_back();
      }
    }
  return ret;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  for (int i = 0; i < n; i++)
    if (adj[i].empty()) ziro.push_back(i);
  for (int i = 0; i < n; i++)
    if (!mark[i]) {
      vector<int> vec = dfs(i);
      if (vec.size() > 3) {
        cout << -1;
        return 0;
      } else if (vec.size() == 3) {
        for (int j = 0; j < 3; j++) ans[poi][j] = vec[j];
        poi++;
      } else if (vec.size() == 2) {
        if (ziro.empty()) {
          cout << -1;
          return 0;
        }
        for (int j = 0; j < 2; j++) ans[poi][j] = vec[j];
        ans[poi][2] = ziro.back();
        ziro.pop_back();
        poi++;
      }
    }
  if (ziro.size() % 3 != 0) {
    cout << -1;
    return 0;
  }
  while (ziro.size()) {
    for (int i = 0; i < 3; i++) {
      ans[poi][i] = ziro.back();
      ziro.pop_back();
    }
    poi++;
  }
  for (int i = 0; i < poi; i++) {
    for (int j = 0; j < 3; j++) cout << ans[i][j] + 1 << ' ';
    cout << '\n';
  }
}
