#include <bits/stdc++.h>
using namespace std;
int par[50];
set<int> parentc[50];
vector<int> remaining;
int flag = 0;
set<int> parents_name;
set<int>::iterator it, ti;
int find(int r) {
  if (par[r] == r) return r;
  par[r] = find(par[r]);
  return par[r];
}
void unionCheck(int a, int b) {
  if (a > b) swap(a, b);
  int u = find(a);
  int v = find(b);
  par[v] = u;
  parents_name.insert(par[v]);
  parentc[par[v]].insert(v);
  if (parentc[par[v]].size() > 3) flag = 1;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i < 50; i++) {
    par[i] = i;
    parentc[i].insert(i);
  }
  int a, b;
  vector<int> giv;
  for (int i = 1; i < m + 1; i++) {
    scanf("%d %d", &a, &b);
    giv.push_back(a);
    giv.push_back(b);
    unionCheck(a, b);
  }
  for (int i = 1; i < n + 1; i++) {
    if (find(giv.begin(), giv.end(), i) == giv.end()) {
      remaining.push_back(i);
    }
  }
  if (flag || parents_name.size() > (n / 3)) {
    printf("-1\n");
    return 0;
  }
  int j = 0;
  for (it = parents_name.begin(); it != parents_name.end(); it++) {
    int siz = parentc[(*it)].size();
    for (ti = parentc[(*it)].begin(); ti != parentc[(*it)].end(); ti++) {
      printf("%d ", *ti);
    }
    if (siz < 3) {
      printf("%d ", remaining[j]);
      j++;
    }
    puts("");
  }
  for (int k = j; k < remaining.size(); k += 3) {
    printf("%d %d %d\n", remaining[k], remaining[k + 1], remaining[k + 2]);
  }
  return 0;
}
