#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;
}
