#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
vector<int> g[N], s[N];
vector<tuple<int, int, int> > ans;
int tin[N], timer;
bool used[N];
bool dfs(int v, int p = -1) {
  tin[v] = ++timer;
  used[v] = 1;
  for (int to : g[v]) {
    if (to == p) {
      continue;
    }
    if (!used[to]) {
      if (dfs(to, v)) {
        s[v].push_back(to);
      }
    } else if (tin[to] > tin[v]) {
      s[v].push_back(to);
    }
  }
  for (int i = 1; i < s[v].size(); i += 2) {
    ans.push_back(make_tuple(s[v][i], v, s[v][i - 1]));
  }
  if (s[v].size() % 2) {
    if (p != -1) {
      ans.push_back(make_tuple(p, v, s[v][s[v].size() - 1]));
    }
    return false;
  }
  return true;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) {
    if (!used[i]) {
      dfs(i);
    }
  }
  printf("%d\n", ans.size());
  for (auto it : ans) {
    printf("%d %d %d\n", get<0>(it), get<1>(it), get<2>(it));
  }
}
