#include <bits/stdc++.h>
using namespace std;
const double PI = M_PI;
const int INF = 1 * 1e9;
const long long limit = -1 * 1e16;
const int MOD1 = 1e9 + 711;
const int MOD2 = 1e9 + 933;
const int MOD3 = 1e9 + 993;
const int maxn = 1e6 + 100;
int find_s(vector<int> &p, int x) {
  while (x != p[x]) {
    x = p[x];
  }
  return x;
}
void unite(vector<int> &p, vector<int> &r, int a, int b) {
  a = find_s(p, a);
  b = find_s(p, b);
  if (a == b) {
    return;
  }
  if (r[a] > r[b]) {
    swap(a, b);
  }
  if (r[a] == r[b]) {
    ++r[b];
  }
  p[a] = p[b];
}
int main() {
  cout.tie(0);
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<int> p(n + 1), r(n + 1);
  for (int i = 1; i <= n; ++i) {
    p[i] = i;
    r[i] = 1;
  }
  vector<bool> used(n + 1);
  for (int i = 0; i < m; ++i) {
    int x, y;
    cin >> x >> y;
    unite(p, r, x, y);
  }
  map<int, set<int>> cp;
  multiset<pair<int, int>> all;
  for (int i = 1; i <= n; ++i) {
    cp[find_s(p, i)].emplace(i);
  }
  for (auto &i : cp) {
    if (i.second.size() > 3) {
      cout << -1;
      return 0;
    }
    all.emplace(i.second.size(), i.first);
  }
  vector<vector<int>> ans;
  while (!all.empty()) {
    if (all.rbegin()->first == 3) {
      vector<int> cur;
      for (auto &i : cp[all.rbegin()->second]) {
        cur.emplace_back(i);
      }
      ans.emplace_back(cur);
      all.erase(--all.end());
    } else if (all.rbegin()->first == 2) {
      vector<int> cur;
      if (all.begin()->first != 1) {
        cout << -1;
        return 0;
      }
      for (auto &i : cp[all.rbegin()->second]) {
        cur.emplace_back(i);
      }
      cur.emplace_back(*cp[all.begin()->second].begin());
      all.erase(--all.end());
      all.erase(all.begin());
      ans.emplace_back(cur);
    } else {
      if (all.size() < 3) {
        cout << -1;
        return 0;
      }
      vector<int> cur;
      for (int j = 0; j < 3; ++j) {
        pair<int, int> c = *all.begin();
        cur.emplace_back(*cp[c.second].begin());
        all.erase(all.begin());
      }
      ans.emplace_back(cur);
    }
    cout << '\n';
  }
  for (int t = 0; t < ans.size(); ++t) {
    for (auto &i : ans[t]) {
      cout << i << ' ';
    }
    cout << '\n';
  }
  cerr << "\n\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  return 0;
}
