#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
int n, m;
set<int> g[110000], gr[110000];
vector<int> g0[110000];
int tim[110000];
int timer = 0;
vector<int> wit[110000];
int boolbool[110000];
void vyklyk(int j);
void vyklyk2(int j) {
  int z = *(gr[j].begin());
  g[z].erase(j);
  gr[j].erase(z);
  g[j].erase(boolbool[j]);
  gr[boolbool[j]].erase(j);
  printf("%d %d %d\n", z, j, boolbool[j]);
  boolbool[j] = 0;
  vyklyk(j);
  if (g[z].empty()) vyklyk(z);
  if (g[z].size() == 1 && boolbool[z]) vyklyk2(z);
}
void vyklyk(int j) {
  while (gr[j].size() >= 2) {
    int b1 = *(gr[j].begin()), b2 = *(++gr[j].begin());
    printf("%d %d %d\n", b1, j, b2);
    g[b1].erase(j);
    gr[j].erase(b1);
    g[b2].erase(j);
    gr[j].erase(b2);
    if (g[b1].empty()) vyklyk(b1);
    if (g[b1].size() == 1 && boolbool[b1]) vyklyk2(b1);
    if (g[b2].empty()) vyklyk(b2);
    if (g[b2].size() == 1 && boolbool[b2]) vyklyk2(b2);
  }
  if (gr[j].size() == 1) {
    int bbb = *(gr[j].begin());
    if (g[bbb].size() == 1) {
      int bbb2 = *(gr[bbb].begin());
      printf("%d %d %d\n", j, bbb, bbb2);
      g[bbb].erase(j);
      gr[j].erase(bbb);
      g[bbb2].erase(bbb);
      gr[bbb].erase(bbb2);
      vyklyk(bbb);
      if (g[bbb2].size() == 0) vyklyk(bbb2);
      if (g[bbb2].size() == 1 && boolbool[bbb2]) vyklyk2(bbb2);
    } else {
      if (boolbool[bbb] == 0 || boolbool[bbb] == j)
        boolbool[bbb] = j;
      else {
        printf("%d %d %d\n", j, bbb, boolbool[bbb]);
        g[bbb].erase(j);
        gr[j].erase(bbb);
        g[bbb].erase(boolbool[bbb]);
        gr[boolbool[bbb]].erase(bbb);
        boolbool[bbb] = 0;
        if (g[bbb].size() == 0) vyklyk(bbb);
        if (g[bbb].size() == 1 && boolbool[bbb]) vyklyk2(bbb);
      }
    }
  }
}
void dfs0(int x) {
  tim[x] = ++timer;
  for (int(i) = (0); i < (g0[x].size()); ++(i))
    if (!tim[g0[x][i]]) dfs0(g0[x][i]);
}
int main() {
  cin >> n >> m;
  if (m % 2 == 1) {
    cout << "No solution";
    return 0;
  }
  for (int(i) = (0); i < (m); ++(i)) {
    int a, b;
    scanf("%d%d", &a, &b);
    g0[a].push_back(b);
    g0[b].push_back(a);
  }
  dfs0(n);
  for (int(i) = (1); i < (n + 1); ++(i))
    for (int(j) = (0); j < (g0[i].size()); ++(j))
      if (i < g0[i][j]) {
        if (tim[i] < tim[g0[i][j]]) {
          g[i].insert(g0[i][j]);
          gr[g0[i][j]].insert(i);
        } else {
          g[g0[i][j]].insert(i);
          gr[i].insert(g0[i][j]);
        }
      }
  for (int(i) = (1); i < (n + 1); ++(i)) {
    if (g[i].empty()) vyklyk(i);
    if (g[i].size() == 1 && boolbool[i]) vyklyk2(i);
  }
  return 0;
}
