#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum=0;
int n,m,ans=0;
int s1,t1,l1,s2,t2,l2;
struct node{
int to,nxt,val;
}w[114514<<1];
int h[114514<<1];
int cnt=0;
void Link(int x,int y,int val){
++cnt;
w[cnt].to=y;
w[cnt].nxt=h[x];
w[cnt].val=val;
h[x]=cnt;
}
bool vis[114514<<1];
int dis[114514<<1],diss[114514<<1];
int u[114514<<1],v[114514<<1],ww[114514<<1];
int pre[114514<<1];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void dijkstra(int st){
for(int i=1;i<=n;i++){
dis[i]=INT_MAX;
diss[i]=INT_MAX;
}
diss[st]=dis[st]=0;
q.push(make_pair(0,st));
while(!q.empty()){
int xx=q.top().first;
int x=q.top().second;
q.pop();
vis[x]=false;
for(int i=h[x];i!=0;i=w[i].nxt){
int y=w[i].to,val=w[i].val;
if(dis[y]>dis[x]+1||(dis[y]>dis[x]+val&&dis[y]==dis[x]+1)){
pre[y]=x;
dis[y]=dis[x]+1;
diss[y]=diss[x]+val;
if(!vis[y]){
vis[y]=true;
q.push(make_pair(dis[y],y));
}
}
}
}
return ;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u[i]>>v[i]>>ww[i];
Link(u[i],v[i],ww[i]);
Link(v[i],u[i],ww[i]);
sum+=ww[i];
}
dijkstra(1);
memset(vis,false,sizeof(vis));
vis[1]=true;
int ui=n;
while(ui!=1){
vis[ui]=true;
ui=pre[ui];
}
for(int i=1;i<=m;i++){
if((vis[u[i]])&&(vis[v[i]])&&(ww[i]==0)) ans++;
if(((!vis[u[i]])||(!vis[v[i]]))&&(ww[i]==1)) ans++;
}
cout<<ans<<endl;
for(int i=1;i<=m;i++){
if((vis[u[i]])&&(vis[v[i]])&&(ww[i]==0)) cout<<u[i]<<" "<<v[i]<<" 1"<<endl;
if(((!vis[u[i]])||(!vis[v[i]]))&&(ww[i]==1)) cout<<u[i]<<" "<<v[i]<<" 0"<<endl;
}
return 0;
}