#include <bits/stdc++.h>   using namespace std;   const long long inf = 2147383647;   const double pi = 2 * acos(0.0);   const double eps = 1e-9;   struct debugger {     template <typename T>     debugger& operator,(const T& v) {       cerr << v <<    ;       return *this;     }   } dbg;   inline long long gcd(long long a, long long b) {     a = ((a) < 0 ? -(a) : (a));     b = ((b) < 0 ? -(b) : (b));     while (b) {       a = a % b;       swap(a, b);     }     return a;   }   int ext_gcd(int a, int b, int& x, int& y) {     if (a == 0) {       x = 0;       y = 1;       return b;     }     int x1, y1;     int d = ext_gcd(b % a, a, x1, y1);     x = y1 - (b / a) * x1;     y = x1;     return d;   }   inline long long modInv(int a, int m) {     int x, y;     ext_gcd(a, m, x, y);     if (x < 0) x += m;     return x;   }   inline long long power(long long a, long long p) {     long long res = 1, x = a;     while (p) {       if (p & 1) res = (res * x);       x = (x * x);       p >>= 1;     }     return res;   }   inline long long bigmod(long long a, long long p, long long m) {     long long res = 1, x = a % m;     while (p) {       if (p & 1) res = (res * x) % m;       x = (x * x) % m;       p >>= 1;     }     return res;   }   vector<pair<int, int> > adj[100010];   pair<int, int> vis[100010];   int n;   struct road {     int u, v, w;   } rdd[100010];   pair<int, int> par[100010];   void bfs() {     pair<int, int> xyz = make_pair(inf, inf);     for (int i = (1); i <= (n); ++i) vis[i] = xyz;     queue<int> q;     q.push(1);     vis[1] = make_pair(0, 0);     while (!q.empty()) {       int s = q.front();       q.pop();       for (int i = (0); i <= (((int)(adj[s]).size()) - 1); ++i) {         xyz = adj[s][i];         int t = xyz.first;         int w = 1 - xyz.second;         if (vis[t].first == inf || vis[s].first + 1 < vis[t].first) {           vis[t] = make_pair(vis[s].first + 1, vis[s].second + w);           q.push(t);           par[t] = make_pair(s, i);         } else if (vis[s].first + 1 == vis[t].first) {           if (vis[s].second + w < vis[t].second) {             vis[t].second = vis[s].second + w;             par[t] = make_pair(s, i);           }         }       }     }   }   int mark[100010];   set<pair<int, int> > st;   int main() {     int m;     scanf( %d %d , &n, &m);     int good = 0;     for (int i = (0); i <= (m - 1); ++i) {       int u, v, w;       scanf( %d %d %d , &u, &v, &w);       rdd[i].u = u;       rdd[i].v = v;       rdd[i].w = w;       adj[u].push_back(make_pair(v, w));       adj[v].push_back(make_pair(u, w));       if (w == 1) good++;     }     bfs();     pair<int, int> temp;     int cur = n;     while (cur != 1) {       temp = par[cur];       int s = temp.first;       int t = cur;       st.insert(make_pair(s, t));       st.insert(make_pair(t, s));       cur = s;     }     int x = vis[n].second;     int k = 2 * x + good - vis[n].first;     printf( %d n , k);     for (int i = (0); i <= (m - 1); ++i) {       int u = rdd[i].u;       int v = rdd[i].v;       int w = rdd[i].w;       if (w == 1 && st.find(make_pair(u, v)) == st.end()) {         printf( %d %d %d n , u, v, 1 - w);       } else if (w == 0 && st.find(make_pair(u, v)) != st.end()) {         printf( %d %d %d n , u, v, 1 - w);       }     }     return 0;   }