#include <bits/stdc++.h>
using namespace std;
map<pair<long long, long long>, bool> blocked;
vector<vector<pair<long long, long long> > > graph;
vector<bool> used;
int part(int v) {
  vector<long long> adj;
  for (int i = 0; i < graph[v].size(); i++) {
    long long w = graph[v][i].first;
    long long ui = graph[v][i].second;
    if (!used[ui]) {
      adj.push_back(w);
      used[ui] = true;
    }
  }
  long long lst = 0;
  for (int i = 0; i < adj.size(); i++) {
    long long w = part(adj[i]);
    if (w == 0) {
      if (lst == 0) {
        lst = adj[i];
      } else {
        cout << lst << " " << v << " " << adj[i] << "\n";
        lst = 0;
      }
    } else {
      cout << v << " " << adj[i] << " " << w << "\n";
    }
  }
  return lst;
}
int main() {
  int n, m;
  cin >> n >> m;
  graph.resize(n + 1);
  used.resize(m);
  for (int i = 0; i < m; i++) {
    long long a, b;
    cin >> a >> b;
    graph[a].push_back(make_pair(b, i));
    graph[b].push_back(make_pair(a, i));
  }
  if (m % 2 == 1) {
    cout << "No solution"
         << "\n";
  } else {
    part(1);
  }
  return 0;
}
