#include <bits/stdc++.h>
using namespace std;
const int max_n = 48 + 100;
vector<int> value[max_n];
vector<int> tmp;
bool mark[max_n];
void dfs(int v) {
  if (mark[v] == false) {
    tmp.push_back(v);
    mark[v] = true;
    for (int i = 0; i < value[v].size(); i++) {
      if (mark[value[v][i]] == false) dfs(value[v][i]);
    }
  }
}
int check(int n) {
  vector<int> answer[max_n];
  vector<int> tmpo;
  for (int i = 1; i <= n; i++)
    if (value[i].size() == 0) tmpo.push_back(i);
  int size = 0;
  for (int i = 1; i <= n; i++) {
    if (mark[i] == false) {
      tmp.clear();
      dfs(i);
      if ((tmp.size() > 3) || ((tmp.size() == 2) && (tmpo.size() == 0))) {
        cout << -1 << endl;
        return 0;
      }
      if (tmp.size() == 3) {
        answer[size].push_back(tmp[0]);
        answer[size].push_back(tmp[1]);
        answer[size].push_back(tmp[2]);
        size++;
      }
      if (tmp.size() == 2) {
        answer[size].push_back(tmp[0]);
        answer[size].push_back(tmp[1]);
        answer[size].push_back(tmpo[tmpo.size() - 1]);
        tmpo.pop_back();
        size++;
      }
    }
  }
  if (tmpo.size() % 3 != 0) {
    cout << -1 << endl;
    return 0;
  }
  for (int i = 0; i < tmpo.size(); i += 3) {
    answer[size].push_back(tmpo[i]);
    answer[size].push_back(tmpo[i + 1]);
    answer[size].push_back(tmpo[i + 2]);
    size++;
  }
  for (int i = 0; i < size; i++) {
    cout << answer[i][0] << " " << answer[i][1] << " " << answer[i][2] << endl;
  }
  return 0;
}
int main(int argc, const char* argv[]) {
  int n;
  cin >> n;
  int m;
  cin >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    value[a].push_back(b);
    value[b].push_back(a);
  }
  check(n);
  return 0;
}
