#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<int> > pref;
bool numPref(const vector<int>& vec) {
  return accumulate(vec.begin(), vec.end(), 0, plus<int>()) > 0;
}
struct triplet {
  int a, b, c;
  triplet(int a0, int b0, int c0) : a(a0), b(b0), c(c0) {}
};
void recurse(int ind, vector<int>& vec) {
  for (int i = 0; i < n; i++)
    if (pref[ind][i] && !vec[i]) {
      vec[i] = 1;
      recurse(i, vec);
    }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) pref.push_back(vector<int>(n, 0));
  for (int i = 0; i < m; i++) {
    int num1, num2;
    cin >> num1 >> num2;
    int a = num1 - 1, b = num2 - 1;
    pref[a][b] = pref[b][a] = 1;
  }
  vector<int> nopref(n, 0);
  for (int i = 0; i < n; i++)
    if (!numPref(pref[i])) nopref[i] = 1;
  bool possible = true;
  vector<int> chosen(n, 0);
  vector<triplet> res;
  for (int i = 0; i < n; i++) {
    if (chosen[i] || nopref[i]) continue;
    int num = numPref(pref[i]);
    if (num > 2) {
      possible = false;
      break;
    }
    vector<int> ret(n, 0);
    ret[i] = 1;
    recurse(i, ret);
    int total = accumulate(ret.begin(), ret.end(), 0, plus<int>());
    if (total > 3) {
      possible = false;
      break;
    } else if (total == 2) {
      int j;
      for (j = 0; j < n; j++)
        if (nopref[j] && !chosen[j]) break;
      if (j == n) {
        possible = false;
        break;
      } else {
        vector<int> result;
        for (int i = 0; i < n; i++)
          if (ret[i]) result.push_back(i);
        triplet tmp(result[0], result[1], j);
        res.push_back(tmp);
        chosen[result[0]] = chosen[result[1]] = chosen[j] = 1;
      }
    } else if (total == 3) {
      vector<int> result;
      for (int i = 0; i < n; i++)
        if (ret[i]) result.push_back(i);
      triplet tmp(result[0], result[1], result[2]);
      res.push_back(tmp);
      chosen[result[0]] = chosen[result[1]] = chosen[result[2]] = 1;
    } else {
      cout << "wrong" << endl;
    }
  }
  if (!possible) {
    cout << -1 << endl;
  } else {
    if (accumulate(chosen.begin(), chosen.end(), 0, plus<int>()) % 3) {
      possible = false;
      cout << -1 << endl;
    } else {
      int count = 0;
      for (int i = 0; i < n; i++) {
        if (!chosen[i]) {
          count++;
          if (count == 3) {
            cout << i + 1 << endl;
            count = 0;
          } else {
            cout << i + 1 << " ";
          }
        }
      }
    }
    if (possible) {
      for (unsigned i = i; i < res.size(); i++) {
        cout << res[i].a + 1 << " ";
        cout << res[i].b + 1 << " ";
        cout << res[i].c + 1 << endl;
      }
    }
  }
  return 0;
}
