#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10;
int n, m, d[MAXN], w[MAXN];
set<int> e[MAXN];
vector<pair<int, pair<int, int> > > Tohka;
priority_queue<pair<int, int> > q;
void Work(int first) {
  int second = *e[first].begin();
  --d[second];
  e[second].erase(first);
  q.push(make_pair(-d[second], second));
  if (w[first])
    Tohka.push_back(make_pair(w[first], make_pair(first, second)));
  else if (w[second])
    Tohka.push_back(make_pair(first, make_pair(second, w[second]))),
        w[second] = 0;
  else
    w[second] = first;
}
int main() {
  scanf("%d%d", &n, &m);
  if (m & 1) puts("No solution"), exit(0);
  for (int i = 1; i <= m; ++i) {
    int first, second;
    scanf("%d%d", &first, &second);
    e[first].insert(second);
    e[second].insert(first);
    ++d[first], ++d[second];
  }
  for (int i = 1; i <= n; ++i) q.push(make_pair(-d[i], i));
  while (!q.empty()) {
    pair<int, int> c = q.top();
    q.pop();
    if (-c.first != d[c.second] || !d[c.second]) continue;
    if (-c.first == 1) {
      Work(c.second);
      continue;
    }
    int a = 0, da = MAXN, b = 0, db = MAXN;
    for (set<int>::iterator it = e[c.second].begin(); it != e[c.second].end();
         ++it) {
      if (da > d[*it])
        b = a, db = da, a = *it, da = d[*it];
      else if (db > d[*it])
        b = *it, db = d[*it];
    }
    if (w[c.second]) {
      --d[a];
      e[a].erase(c.second);
      e[c.second].erase(a);
      q.push(make_pair(-d[a], a));
      Tohka.push_back(make_pair(a, make_pair(c.second, w[c.second])));
      --d[c.second];
      q.push(make_pair(-d[c.second], c.second));
      w[c.second] = 0;
      continue;
    }
    --d[a];
    e[a].erase(c.second);
    --d[b];
    e[b].erase(c.second);
    e[c.second].erase(a), e[c.second].erase(b);
    d[c.second] -= 2;
    q.push(make_pair(-d[a], a));
    q.push(make_pair(-d[b], b));
    if (d[c.second]) q.push(make_pair(-d[c.second], c.second));
    Tohka.push_back(make_pair(a, make_pair(c.second, b)));
  }
  for (int i = 0; i < (int)Tohka.size(); ++i)
    printf("%d %d %d\n", Tohka[i].first, Tohka[i].second.first,
           Tohka[i].second.second);
  fclose(stdin);
  fclose(stdout);
  return 0;
}
