#include <bits/stdc++.h>
using namespace std;
int n, m;
int fa[2510], cnt[2510];
bool vis[2510];
vector<int> ans[2510];
int sz;
int getfa(int a) {
  if (fa[a] == a) return a;
  return fa[a] = getfa(fa[a]);
}
void join(int x, int y) {
  x = getfa(x);
  y = getfa(y);
  if (x != y) {
    if (x > y) {
      fa[y] = x;
      cnt[x] += cnt[y];
    } else {
      fa[x] = y;
      cnt[y] += cnt[x];
    }
  }
}
void init() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    fa[i] = i;
    cnt[i] = 1;
  }
  int a, b;
  for (int i = 1; i <= m; i++) {
    cin >> a >> b;
    join(a, b);
  }
}
void doing() {
  int cnt1, cnt2;
  cnt1 = cnt2 = 0;
  for (int i = 1; i <= n; i++) {
    if (getfa(i) == i) {
      if (cnt[i] > 3) {
        puts("-1");
        return;
      }
      if (cnt[i] == 3) {
        vis[i] = 1;
        sz++;
        ans[sz].push_back(i);
        for (int j = 1; j <= n; j++) {
          if (getfa(j) == i && !vis[j]) {
            vis[j] = 1;
            ans[sz].push_back(j);
          }
        }
      }
      if (cnt[i] == 2) cnt2++;
      if (cnt[i] == 1) cnt1++;
    }
  }
  if (cnt2 > cnt1) {
    puts("-1");
    return;
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i] && cnt[i] == 2) {
      vis[i] = 1;
      sz++;
      ans[sz].push_back(i);
      for (int j = 1; j <= n; j++) {
        if (getfa(j) == i && !vis[j]) {
          vis[j] = 1;
          ans[sz].push_back(j);
          break;
        }
      }
      for (int j = 1; j <= n; j++) {
        if (!vis[j] && cnt[j] == 1 && getfa(j) == j) {
          vis[j] = 1;
          ans[sz].push_back(j);
          break;
        }
      }
    }
  }
  int t = 0;
  for (int i = 1; i <= n; i++) {
    if (!vis[i] && cnt[i] == 1 && getfa(i) == i) {
      if (t == 0) sz++;
      ans[sz].push_back(i);
      t++;
      t %= 3;
    }
  }
  for (int i = 1; i <= sz; i++) {
    for (int j = 0; j < 3; j++) cout << ans[i][j] << " ";
    cout << endl;
  }
}
int main() {
  init();
  doing();
  return 0;
}
