#include <bits/stdc++.h>
using namespace std;
const int MAX = 2e5;
vector<int> adj[MAX + 1];
map<pair<int, int>, bool> tree;
map<pair<int, int>, bool> used;
bool vis[MAX + 1] = {false};
vector<pair<pair<int, int>, pair<int, int>>> matching;
void DFS(int v) {
  vis[v] = true;
  for (auto u : adj[v]) {
    if (!vis[u]) {
      tree[{v, u}] = true;
      tree[{u, v}] = true;
      DFS(u);
    }
  }
}
void DFS2(int v, int par) {
  vis[v] = true;
  vector<pair<int, int>> edges;
  for (auto u : adj[v]) {
    if (u != par) {
      if (tree[{v, u}]) DFS2(u, v);
      if (!used[{u, v}]) {
        used[{v, u}] = true;
        used[{u, v}] = true;
        edges.push_back({v, u});
      }
    }
  }
  if ((int)edges.size() % 2) {
    if (par) {
      used[{v, par}] = true;
      used[{par, v}] = true;
      edges.push_back({v, par});
      for (int i = 0; i < (int)edges.size(); i += 2) {
        matching.push_back({edges[i], edges[i + 1]});
      }
    } else {
      for (int i = 0; i + 1 < (int)edges.size(); i += 2) {
        matching.push_back({edges[i], edges[i + 1]});
      }
    }
  } else {
    for (int i = 0; i + 1 < (int)edges.size(); i += 2) {
      matching.push_back({edges[i], edges[i + 1]});
    }
  }
}
void solve() {
  int n, m;
  cin >> n >> m;
  for (int j = 0; j < m; j++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int j = 1; j <= n; j++)
    if (!vis[j]) DFS(j);
  for (int j = 1; j <= n; j++) vis[j] = false;
  for (int j = 1; j <= n; j++) {
    if (!vis[j]) DFS2(j, 0);
  }
  cout << (int)matching.size() << '\n';
  for (auto p : matching) {
    map<int, int> cnt;
    cnt[p.first.first]++;
    cnt[p.first.second]++;
    cnt[p.second.first]++;
    cnt[p.second.second]++;
    int mid = 0;
    for (auto it = cnt.begin(); it != cnt.end(); it++) {
      if (it->second == 2) mid = it->first;
    }
    int f = 0;
    for (auto it = cnt.begin(); it != cnt.end(); it++) {
      if (it->first != mid) {
        cout << it->first << ' ';
        f = it->first;
        break;
      }
    }
    cout << mid << ' ';
    for (auto it = cnt.begin(); it != cnt.end(); it++) {
      if (it->first != mid && it->first != f) {
        cout << it->first;
        break;
      }
    }
    cout << '\n';
  }
  return;
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  int t;
  t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
