#include <bits/stdc++.h>
using namespace std;
int n, m, tot, res = 0, f[666666], g[666666], q[666666], ans[666666][3];
struct edge {
  int adj, nex;
  bool vis;
  edge(int a_ = 0, int n_ = 0) {
    adj = a_;
    nex = n_;
    vis = false;
  }
} e[666666];
void add(int u, int v) {
  e[++tot] = edge(v, e[u].nex);
  e[u].nex = tot;
  e[++tot] = edge(u, e[v].nex);
  e[v].nex = tot;
}
void bfs(int x) {
  int l = 0, r = 1;
  q[1] = x;
  f[x] = -1;
  while (l < r) {
    for (int i = e[q[++l]].nex; i; i = e[i].nex) {
      if (!f[e[i].adj]) {
        q[++r] = e[i].adj;
        f[e[i].adj] = q[l];
      }
    }
  }
  for (int i = r; i; i--) {
    g[0] = 0;
    for (int j = e[q[i]].nex; j; j = e[j].nex) {
      if (!e[j].vis && e[j].adj != f[q[i]]) {
        g[++g[0]] = j;
      }
    }
    for (int j = e[q[i]].nex; j; j = e[j].nex) {
      if (!e[j].vis && e[j].adj == f[q[i]]) {
        g[++g[0]] = j;
        break;
      }
    }
    for (int j = 1; j < g[0]; j += 2) {
      e[g[j]].vis = e[g[j] ^ 1].vis = e[g[j + 1]].vis = e[g[j + 1] ^ 1].vis =
          true;
      ans[++res][0] = e[g[j]].adj;
      ans[res][1] = q[i];
      ans[res][2] = e[g[j + 1]].adj;
    }
  }
}
int main() {
  int u, v;
  scanf("%d%d", &n, &m);
  tot = n | 1;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &u, &v);
    add(u, v);
  }
  for (int i = 1; i <= n; i++) {
    if (!f[i]) {
      bfs(i);
    }
  }
  printf("%d\n", res);
  for (int i = 1; i <= res; i++) {
    printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
  }
  return 0;
}
