#include <bits/stdc++.h>
using namespace std;
struct tour {
  int a, b, c;
  tour(){};
  tour(int a, int b, int c) : a(a), b(b), c(c){};
};
vector<tour> ans;
vector<bool> was;
vector<vector<int> > g;
map<pair<int, int>, bool> was_road;
void dfs(int v, int p) {
  was[v] = true;
  vector<int> add;
  for (auto u : g[v])
    if (!was[u]) {
      dfs(u, v);
      if (!was_road[make_pair(v, u)]) add.push_back(u);
    } else {
      if (!was_road[make_pair(v, u)] && u != p) add.push_back(u);
    }
  if (add.size() == 0) {
  } else if (add.size() == 1 && p == -1) {
  } else if (add.size() == 1 && p > -1) {
    ans.push_back(tour(p, v, add[0]));
    was_road[make_pair(p, v)] = true;
    was_road[make_pair(v, p)] = true;
    was_road[make_pair(v, add[0])] = true;
    was_road[make_pair(add[0], v)] = true;
  } else if (add.size() % 2 == 0) {
    for (int i = 0; i < add.size() - 1; i += 2) {
      ans.push_back(tour(add[i], v, add[i + 1]));
      was_road[make_pair(add[i], v)] = true;
      was_road[make_pair(v, add[i])] = true;
      was_road[make_pair(add[i + 1], v)] = true;
      was_road[make_pair(v, add[i + 1])] = true;
    }
  } else {
    for (int i = 0; i < add.size() - 2; i += 2) {
      ans.push_back(tour(add[i], v, add[i + 1]));
      was_road[make_pair(add[i], v)] = true;
      was_road[make_pair(v, add[i])] = true;
      was_road[make_pair(add[i + 1], v)] = true;
      was_road[make_pair(v, add[i + 1])] = true;
    }
    if (p > -1) {
      ans.push_back(tour(p, v, add.back()));
      was_road[make_pair(p, v)] = true;
      was_road[make_pair(v, p)] = true;
      was_road[make_pair(v, add.back())] = true;
      was_road[make_pair(add.back(), v)] = true;
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed;
  int n, m;
  cin >> n >> m;
  g = vector<vector<int> >(n, vector<int>());
  was.resize(n);
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 0; i < n; ++i)
    if (!was[i]) dfs(i, -1);
  cout << ans.size() << '\n';
  for (auto t : ans)
    cout << (t.a + 1) << ' ' << (t.b + 1) << ' ' << (t.c + 1) << '\n';
}
