#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> G[200009];
vector<int> voltel[200009];
vector<int> hanyadikm[200009];
int apa[200009];
int melyseg[200009];
bool bejar[200009];
int maradtszom[200009];
vector<pair<pair<int, int>, int> > answer;
set<pair<pair<int, int>, pair<int, int> > > second;
int gyszam[200009];
bool fael(int x, int y) {
  if (apa[x] == y || apa[y] == x) return true;
  return false;
}
void dfs(int x) {
  bejar[x] = true;
  for (int i = 0; i < G[x].size(); i++) {
    int sz = G[x][i];
    if (!bejar[sz]) {
      apa[sz] = x;
      gyszam[x]++;
      voltel[x][i] = 2;
      voltel[sz][hanyadikm[x][i]] = 2;
      melyseg[sz] = melyseg[x] - 1;
      dfs(sz);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    G[a].push_back(b);
    G[b].push_back(a);
    voltel[a].push_back(false);
    voltel[b].push_back(false);
    hanyadikm[a].push_back(G[b].size() - 1);
    hanyadikm[b].push_back(G[a].size() - 1);
  }
  for (int i = 1; i <= n; i++) {
    if (!bejar[i]) {
      melyseg[i] = -1;
      dfs(i);
    }
  }
  for (int i = 1; i <= n; i++) {
    int joindex = -1;
    for (int j = 0; j < G[i].size(); j++) {
      if (voltel[i][j] == 0) {
        if (joindex == -1) {
          joindex = j;
        } else {
          int sz1 = G[i][joindex];
          int sz2 = G[i][j];
          voltel[i][joindex] = 1;
          voltel[i][j] = 1;
          voltel[sz1][hanyadikm[i][joindex]] = 1;
          voltel[sz2][hanyadikm[i][j]] = 1;
          answer.push_back({{sz1, i}, sz2});
          joindex = -1;
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < G[i].size(); j++) {
      if (voltel[i][j] == 0) {
        maradtszom[i] = G[i][j];
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (apa[i] == 0) continue;
    if (gyszam[i] != 0) continue;
    pair<pair<int, int>, pair<int, int> > aq;
    aq.first.first = melyseg[i];
    aq.first.second = apa[i];
    aq.second.first = -maradtszom[i];
    aq.second.second = i;
    second.insert(aq);
  }
  while (second.size() > 0) {
    pair<pair<int, int>, pair<int, int> > lev = *second.begin();
    int lcs = lev.second.second;
    int acs = lev.first.second;
    int melycs = lev.first.first;
    second.erase(second.begin());
    gyszam[acs]--;
    if (maradtszom[lcs] > 0) {
      answer.push_back({{acs, lcs}, maradtszom[lcs]});
      int malcs = maradtszom[lcs];
      maradtszom[malcs] = 0;
      maradtszom[lcs] = 0;
      if (gyszam[acs] == 0) {
        pair<pair<int, int>, pair<int, int> > aq;
        aq.first.first = melyseg[acs];
        aq.first.second = apa[acs];
        aq.second.first = -maradtszom[acs];
        aq.second.second = acs;
        second.insert(aq);
      }
      continue;
    }
    if (gyszam[acs] > 0) {
      lev = *second.begin();
      int lcs2 = lev.second.second;
      int acs2 = lev.first.second;
      int melycs2 = lev.first.first;
      second.erase(second.begin());
      gyszam[acs]--;
      answer.push_back({{lcs, acs}, lcs2});
      if (gyszam[acs] == 0) {
        pair<pair<int, int>, pair<int, int> > aq;
        aq.first.first = melyseg[acs];
        aq.first.second = apa[acs];
        aq.second.first = -maradtszom[acs];
        aq.second.second = acs;
        second.insert(aq);
      }
      continue;
    }
    if (maradtszom[acs] > 0) {
      answer.push_back({{lcs, acs}, maradtszom[acs]});
      int malcs = maradtszom[acs];
      maradtszom[malcs] = 0;
      maradtszom[acs] = 0;
      pair<pair<int, int>, pair<int, int> > aq;
      aq.first.first = melyseg[acs];
      aq.first.second = apa[acs];
      aq.second.first = -maradtszom[acs];
      aq.second.second = acs;
      second.insert(aq);
      continue;
    }
    if (apa[acs] != 0) {
      answer.push_back({{lcs, acs}, apa[acs]});
      gyszam[apa[acs]]--;
      if (gyszam[apa[acs]] == 0) {
        pair<pair<int, int>, pair<int, int> > aq;
        int acsa = apa[acs];
        aq.first.first = melyseg[acsa];
        aq.first.second = apa[acsa];
        aq.second.first = -maradtszom[acsa];
        aq.second.second = acsa;
        second.insert(aq);
      }
    }
  }
  cout << answer.size() << endl;
  for (int i = 0; i < answer.size(); i++) {
    cout << answer[i].first.first << " " << answer[i].first.second << " "
         << answer[i].second << endl;
  }
  return 0;
}
