#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e5 + 7;
int n, m;
vector<tuple<int, int, int>> res;
vector<pair<int, int>> g[maxN];
bool blocked[maxN];
bool solve(int v, int pr = -1) {
  vector<int> unpaired;
  vector<int> adj;
  for (auto& to : g[v]) {
    if (!blocked[to.second]) {
      adj.push_back(to.first);
    }
    blocked[to.second] = true;
  }
  for (auto& to : adj) {
    if (solve(to, v)) {
      unpaired.push_back(to);
    }
  }
  while (unpaired.size() >= 2) {
    int first = unpaired.back();
    unpaired.pop_back();
    int second = unpaired.back();
    unpaired.pop_back();
    res.push_back(make_tuple(first, v, second));
  }
  if (unpaired.size() > 0) {
    int vertex = unpaired.back();
    unpaired.pop_back();
    res.push_back(make_tuple(pr, v, vertex));
    return false;
  }
  return true;
}
int main() {
  scanf("%d %d", &n, &m);
  if (m % 2 == 1) {
    printf("No solution\n");
    return 0;
  }
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    g[a].push_back({b, i});
    g[b].push_back({a, i});
  }
  solve(1);
  for (auto& x : res) {
    printf("%d %d %d\n", get<0>(x), get<1>(x), get<2>(x));
  }
  return 0;
}
