#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  int f = 1, sum = 0;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    sum = (sum << 3) + (sum << 1) + ch - '0';
    ch = getchar();
  }
  return f * sum;
}
const int N = 300010, Inf = 1e9 + 10;
vector<int> G[N], son[N];
int ans, a[N], b[N], c[N], n, m, dep[N];
int dfs(int u, int ff) {
  dep[u] = dep[ff] + 1;
  int opt = 0;
  for (int v : G[u])
    if (!dep[v]) {
      if (!dfs(v, u)) son[u].push_back(v);
    } else if (dep[v] < dep[u] && v != ff)
      son[u].push_back(v);
  for (int i = 1; i < son[u].size(); i += 2)
    a[++ans] = son[u][i - 1], b[ans] = u, c[ans] = son[u][i];
  if (son[u].size() & 1) {
    if (u != ff) a[++ans] = son[u].back(), b[ans] = u, c[ans] = ff;
    opt = 1;
  }
  return opt;
}
int main() {
  n = gi();
  m = gi();
  for (int i = 1; i <= m; i++) {
    int u = gi(), v = gi();
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int i = 1; i <= n; i++)
    if (!dep[i]) dfs(i, i);
  printf("%d\n", ans);
  for (int i = 1; i <= ans; i++) printf("%d %d %d\n", a[i], b[i], c[i]);
  return 0;
}
