#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g(49);
vector<bool> used(49, 0);
void dfs(int v, vector<int> &b) {
  used[v] = 1;
  b.push_back(v);
  for (int i = 0; i < g[v].size(); i++) {
    if (!used[g[v][i]]) dfs(g[v][i], b);
  }
}
struct info {
  int v1, v2, v3;
};
int main() {
  int n, m, i, x, y, pos, j, kolvo;
  cin >> n >> m;
  vector<int> res;
  vector<info> ans;
  info z;
  for (i = 0; i < m; i++) {
    cin >> x >> y;
    x--;
    y--;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (i = 0; i < n; i++) {
    if (g[i].size() == 0) res.push_back(i);
  }
  bool p = 1;
  for (i = 0; i < n; i++) {
    if (!used[i] && g[i].size() != 0) {
      vector<int> b;
      dfs(i, b);
      if (b.size() > 3 || (3 - b.size() % 3) % 3 > res.size()) {
        p = 0;
        break;
      } else {
        pos = res.size() - 1;
        kolvo = (3 - b.size() % 3) % 3;
        for (i = 0; i < kolvo; i++) {
          b.push_back(res[pos]);
          res.pop_back();
          pos = res.size() - 1;
        }
        z.v1 = b[0];
        used[b[0]] = 1;
        z.v2 = b[1];
        used[b[1]] = 1;
        z.v3 = b[2];
        used[b[2]] = 1;
        ans.push_back(z);
      }
    }
  }
  if (!p || res.size() % 3 != 0)
    cout << -1;
  else {
    for (i = 0; i < ans.size(); i++) {
      cout << ans[i].v1 + 1 << " " << ans[i].v2 + 1 << " " << ans[i].v3 + 1
           << '\n';
    }
    for (i = 0; i < res.size(); i += 3) {
      cout << res[i] + 1 << " " << res[i + 1] + 1 << " " << res[i + 2] + 1
           << '\n';
    }
  }
  return 0;
}
