#include <bits/stdc++.h>
using namespace std;
const int maxn = 2E+5 + 5;
const int maxm = 2E+5 + 5;
int n, m, cnt, tot;
int ans[maxn + maxm][3];
bool vis[maxn];
vector<int> to[maxn];
struct Edge {
  int val;
  bool mark;
} e[maxm + maxn];
int work(int u, int fa) {
  int res = 0;
  vis[u] = 1;
  for (int i = 0; i < to[u].size(); ++i) {
    int v = e[to[u][i]].val ^ u;
    if (!vis[v]) res += work(v, u);
  }
  int fe;
  vector<int> tmp;
  for (int i = 0; i < to[u].size(); ++i) {
    int v = e[to[u][i]].val ^ u;
    if (v == fa)
      fe = to[u][i];
    else if (e[to[u][i]].mark)
      continue;
    else
      e[to[u][i]].mark = 1, tmp.push_back(v);
  }
  if (tmp.size() & 1) tmp.push_back(fa), e[fe].mark = 1;
  for (int i = 0; i < tmp.size(); i += 2) {
    ++tot;
    ans[tot][0] = tmp[i];
    ans[tot][1] = u;
    ans[tot][2] = tmp[i + 1];
  }
  return res + to[u].size();
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[i].val = x ^ y;
    to[x].push_back(i), to[y].push_back(i);
  }
  cnt = m;
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      e[++m].val = i;
      to[0].push_back(m), to[i].push_back(m);
      cnt -= ((work(i, 0) - 1) / 2) & 1;
    }
  }
  printf("%d\n", cnt / 2);
  for (int i = 1; i <= tot; ++i)
    if (ans[i][0] && ans[i][2])
      printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
}
