#include <bits/stdc++.h>
using namespace std;
int n, m, ans, a[1000005], b[1000005], c[1000005], edgenum, f[1000005],
    head[1000005];
struct edge {
  int v, next;
} e[1000005];
void add(int u, int v) {
  e[++edgenum] = edge{v, head[u]};
  head[u] = edgenum;
}
bool vis[1000005];
void dfs(int u) {
  vis[u] = true;
  for (int i = head[u], v; i; i = e[i].next) {
    v = e[i].v;
    e[i].v = e[i ^ 1].v = 0;
    if (v) {
      if (!vis[v]) dfs(v);
      if (f[v])
        a[++ans] = u, b[ans] = v, c[ans] = f[v], f[v] = 0;
      else if (f[u])
        a[++ans] = f[u], b[ans] = u, c[ans] = v, f[u] = 0;
      else
        f[u] = v;
    }
  }
}
int main() {
  edgenum = 1;
  scanf("%d%d", &n, &m);
  for (int u, v; m--;) {
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) dfs(i);
  printf("%d\n", ans);
  for (int i = 1; i <= ans; i++) printf("%d %d %d\n", a[i], b[i], c[i]);
}
