#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const double eps = 1e-8;
int maxz(int a, int b) { return a > b ? a : b; }
int minz(int a, int b) { return a < b ? a : b; }
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
int vis[485];
int team[123][3];
vector<int> edge[49];
int main() {
  int n, m;
  cin >> n >> m;
  int a, b;
  int tot = 0;
  int three = 0;
  int two = 0;
  int one = 0;
  int i, j;
  int mx = n / 3;
  for (i = 1; i <= n; i++) edge[i].push_back(i);
  for (i = 0; i < m; i++) {
    cin >> a >> b;
    edge[a].push_back(b);
    edge[b].push_back(a);
  }
  for (i = 1; i <= n; i++) {
    if (edge[i].size() > 3) {
      printf("-1\n");
      return 0;
    } else if (edge[i].size() == 3 && vis[i] == 0) {
      for (j = 0; j < edge[i].size(); j++) {
        team[three][j] = edge[i][j];
        vis[edge[i][j]] = 1;
      }
      three++;
    }
  }
  two = three;
  for (i = 1; i <= n; i++) {
    if (edge[i].size() == 2 && vis[i] == 0) {
      if (two < mx) {
        for (j = 0; j < edge[i].size(); j++) {
          team[two][j] = edge[i][j];
          vis[edge[i][j]] = 1;
        }
        two++;
      } else {
        printf("-1\n");
        return 0;
      }
    }
  }
  int zero = two;
  for (i = 1; i <= n; i++) {
    if (vis[i]) continue;
    if (three < two) {
      team[three][2] = i;
      three++;
      vis[i] = 1;
    }
  }
  for (i = 0; i < three; i++) {
    for (j = 0; j < 3; j++) {
      printf("%d ", team[i][j]);
    }
    cout << endl;
  }
  for (i = 1; i <= n; i++) {
    if (vis[i]) continue;
    printf("%d ", i);
  }
}
