#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void rread(T& num) {
  num = 0;
  T f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') num = num * 10 + ch - '0', ch = getchar();
  num *= f;
}
const long long inf = 1e18;
const int maxn = 2e5 + 7, mod2 = 41;
const double pi = acos(-1);
long long gcd(long long a, long long b) { return (a ? gcd(b % a, a) : b); }
void exgcd(long long a, long long b, long long& d, long long& x, long long& y) {
  if (!b) {
    d = a;
    x = 1;
    y = 0;
  } else {
    exgcd(b, a % b, d, y, x);
    y -= x * (a / b);
  }
}
unsigned long long power(unsigned long long a, unsigned long long n) {
  unsigned long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
long long power(long long a, long long n) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
long long power(long long a, long long n, long long mod) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
      p %= mod;
    }
    n >>= 1;
    a *= a;
    a %= mod;
  }
  return p % mod;
}
int n, m;
vector<int> nex[maxn], ha[maxn];
int flag[maxn];
int id[maxn];
int tim;
int ff[maxn];
vector<pair<int, int> > ans[maxn];
int sum;
void dfs(int x, int fa) {
  id[x] = tim++;
  flag[x] = 1;
  int be = -1, ge = -1, fg = -1;
  for (int i = 0; i < nex[x].size(); i++) {
    if (nex[x][i] == fa) {
      fg = ha[x][i];
      continue;
    }
    if (flag[nex[x][i]] == 0) {
      dfs(nex[x][i], x);
    }
    if (id[nex[x][i]] > id[x] && ff[ha[x][i]] == 0) {
      if (be != -1) {
        ans[x].push_back(make_pair(be, nex[x][i]));
        ff[ha[x][i]] = 1;
        ff[ge] = 1;
        be = -1;
        ge = -1;
        sum++;
      } else
        be = nex[x][i], ge = ha[x][i];
    }
  }
  if (be != -1 && fg != -1) {
    ans[x].push_back(make_pair(fa, be));
    ff[fg] = 1;
    ff[ge] = 1;
    sum++;
  }
}
int main() {
  int kase = 1;
  int x, y;
  int t;
  while (~scanf("%d%d", &n, &m)) {
    for (int i = 1; i <= n; i++) ha[i].clear(), nex[i].clear(), ans[i].clear();
    for (int i = 1; i <= m; i++) {
      int u, v;
      scanf("%d%d", &u, &v);
      nex[u].push_back(v);
      nex[v].push_back(u);
      ha[u].push_back(i);
      ha[v].push_back(i);
    }
    memset(flag, 0, sizeof flag);
    memset(ff, 0, sizeof ff);
    sum = 0;
    for (int i = 1; i <= n; i++) {
      if (flag[i] == 0) dfs(i, 0);
    }
    cout << sum << endl;
    for (int j = 1; j <= n; j++)
      for (int i = 0; i < ans[j].size(); i++) {
        printf("%d %d %d\n", ans[j][i].first, j, ans[j][i].second);
      }
  }
  return 0;
}
