#include <bits/stdc++.h>
using namespace std;
int n, m, f[110], vis[110];
struct student {
  int num;
  vector<int> ans;
} team[101];
bool cmp(student a, student b) { return a.num > b.num; }
int find(int k) {
  if (f[k] == k) return k;
  return f[k] = find(f[k]);
}
void merge(int a, int b) {
  int A = find(a);
  int B = find(b);
  if (A != B) f[B] = A;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    merge(a, b);
  }
  for (int i = 1; i <= n; i++) {
    int k = find(i);
    team[k].num++;
    team[k].ans.push_back(i);
  }
  for (int i = 1; i <= n; i++)
    if (team[i].num > 3) {
      puts("-1");
      return 0;
    }
  sort(team + 1, team + n + 1, cmp);
  for (int i = 1; i <= n; i++) {
    if ((team[i].num == 1 || team[i].num == 2) && !vis[i]) {
      for (int j = i + 1; j <= n; j++)
        if (team[i].num + team[j].num <= 3 && !vis[j]) {
          team[i].num += team[j].num;
          vis[j] = 1;
          for (int k = 0; k < team[j].ans.size(); k++)
            team[i].ans.push_back(team[j].ans[k]);
        }
      if (team[i].num != 3) {
        puts("-1");
        return 0;
      }
    }
  }
  for (int i = 1; i <= n; i++)
    if (team[i].num == 3)
      printf("%d %d %d\n", team[i].ans[0], team[i].ans[1], team[i].ans[2]);
  return 0;
}
