#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
const int N = 200010;
const int M = 200010;
int n, m;
int v[M * 2], nex[M * 2], beg[N];
int uu[M], vv[M], Ans, Summ, fa[N], e, d[N];
bool vis[N];
vector<int> ls[N];
void add(int uu, int vv) {
  v[++e] = vv;
  nex[e] = beg[uu];
  beg[uu] = e;
}
void Init() {
  n = read();
  m = read();
  for (int i = 1; i <= m; i++) {
    uu[i] = read(), vv[i] = read(), add(uu[i], vv[i]), add(vv[i], uu[i]);
  }
}
void dfs1(int u) {
  vis[u] = 1;
  for (int i = beg[u]; i; i = nex[i]) {
    ++Summ;
    if (!vis[v[i]]) {
      dfs1(v[i]);
      fa[v[i]] = u;
    }
  }
}
void dfs2(int u) {
  for (int i = beg[u]; i; i = nex[i])
    if (fa[v[i]] == u) {
      dfs2(v[i]);
      if (d[v[i]]) {
        d[v[i]] = 0;
        ls[v[i]].push_back(u);
      } else {
        d[u] ^= 1;
        ls[u].push_back(v[i]);
      }
    }
}
void Solve() {
  Ans = 0;
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      Summ = 0;
      dfs1(i);
      Ans += Summ / 4;
    }
  for (int i = 1; i <= m; i++)
    if (fa[uu[i]] != vv[i] && fa[vv[i]] != uu[i]) {
      ls[uu[i]].push_back(vv[i]);
      d[uu[i]] ^= 1;
    }
  for (int i = 1; i <= n; i++)
    if (!fa[i]) dfs2(i);
}
void Print() {
  printf("%d\n", Ans);
  for (int u = 1; u <= n; u++)
    for (int i = 0; i + 1 < (int)ls[u].size(); i += 2)
      printf("%d %d %d\n", ls[u][i], u, ls[u][i + 1]);
}
int main() {
  Init();
  Solve();
  Print();
}
