BubbleSquare social network is celebrating 13^{th} anniversary and it is rewarding its members with special edition BubbleSquare tokens. Every member receives one personal token. Also, two additional tokens are awarded to each member for every friend they have on the network. Yet, there is a twist – everyone should end up with different number of tokens from all their friends. Each member may return one received token. Also, each two friends may agree to each return one or two tokens they have obtained on behalf of their friendship.

Input

First line of input contains two integer numbers n and k (2 ≤ n ≤ 12500, 1 ≤ k ≤ 1000000) - number of members in network and number of friendships.

Next k lines contain two integer numbers a_i and b_i (1 ≤ a_i, b_i ≤ n, a_i ≠ b_i) - meaning members a_i and b_i are friends.

Output

First line of output should specify the number of members who are keeping their personal token.

The second line should contain space separated list of members who are keeping their personal token.

Each of the following k lines should contain three space separated numbers, representing friend pairs and number of tokens each of them gets on behalf of their friendship.

Examples

Input


2 1
1 2


Output


1
1 
1 2 0


Input


3 3
1 2
1 3
2 3


Output


0
1 2 0
2 3 1
1 3 2

Note

In the first test case, only the first member will keep its personal token and no tokens will be awarded for friendship between the first and the second member.

In the second test case, none of the members will keep their personal token. The first member will receive two tokens (for friendship with the third member), the second member will receive one token (for friendship with the third member) and the third member will receive three tokens (for friendships with the first and the second member).
#include <bits/stdc++.h>
using namespace std;
const int mxn = 2e4 + 4;
const int mxm = 1e6 + 6;
vector<pair<int, int> > g[mxn];
int one[mxn], n, m;
int wei[mxn];
struct edge {
  int from, to;
  int cap;
};
inline edge me(int from, int to) {
  edge rt;
  rt.from = from, rt.to = to, rt.cap = 1;
  ++wei[from], ++wei[to];
  return rt;
}
edge e[mxm];
inline void solve() {
  scanf("%d%d", &n, &m);
  for (register int i = 1; i <= m; ++i) {
    register int u, v;
    scanf("%d%d", &u, &v);
    e[i] = me(u, v);
    g[u].push_back(make_pair(v, i));
    g[v].push_back(make_pair(u, i));
  }
  for (int i = 1; i <= n; ++i) {
    int cnt = 0;
    for (int j = 0; j < g[i].size(); ++j) {
      int t = g[i][j].first;
      if (t > i) continue;
      ++cnt;
      if (!one[t]) {
        int id = g[i][j].second;
        --e[id].cap;
        one[t] = 1;
        --wei[i];
      }
    }
    set<int> s;
    s.clear();
    for (int j = 0; j <= cnt; ++j) s.insert(j + wei[i]);
    for (int j = 0; j < g[i].size(); ++j) {
      int t = g[i][j].first;
      if (t > i) continue;
      if (s.find(wei[t]) != s.end()) s.erase(wei[t]);
    }
    int ans = *s.begin();
    int need = ans - wei[i];
    for (int j = 0; j < g[i].size() and need; ++j) {
      int t = g[i][j].first, id = g[i][j].second;
      if (t > i) continue;
      one[t] = 0;
      e[id].cap++;
      wei[i]++;
      --need;
    }
  }
  vector<int> ones;
  for (int i = 1; i <= n; ++i)
    if (one[i]) ones.push_back(i);
  printf("%d\n", ones.size());
  for (int i = 0; i < ones.size(); ++i) printf("%d ", ones[i]);
  if (ones.size()) printf("\n");
  for (int i = 1; i <= m; ++i)
    printf("%d %d %d\n", e[i].from, e[i].to, e[i].cap);
}
int main() {
  ios_base::sync_with_stdio(false);
  int T = 1;
  for (; T--;) solve();
}
