#include<stdio.h>
#include<string.h>
#define N 105
#define M 1005
#define MAX 3000
int niv,n,m,i,v[N][N],c[N][N],f[N][N],nv[N],fol[N],t[N],d[M],v1[N],v2[N],x2[M],y2[M];
void funct(int x,int y,int z){
nv[x]++;
nv[y]++;
v[x][nv[x]]=y;
v[y][nv[y]]=x;
c[x][y]=c[y][x]=z;
}
inline int inv(int x){
if (x>0)
return x;
return -x;
}
inline int min(int a,int b){
if(a<b)
return a;
return b;
}
inline int max(int a,int b){
if (a>b)
return a;
return b;
}
int ice(){
int i,cap=1,coada=1,nod;
d[1]=1;
t[1]=0;
for(i=1;i<=n;i++)
fol[i]=0;
fol[1]=1;
while(cap<=coada){
nod=d[cap];
for (i=1;i<=nv[nod];i++)
if (fol[v[nod][i]]==0 && c[nod][v[nod][i]]-f[nod][v[nod][i]]>0){
coada++;
d[coada]=v[nod][i];
fol[v[nod][i]]=1;
t[v[nod][i]]=nod;
}
cap++;
}
return fol[n];
}
void solve(){
int m;
while (ice()){
m=MAX;
for (i=n;i-1;i=t[i])
m=min(m,c[t[i]][i]-f[t[i]][i]);
for (i=n;i-1;i=t[i]){
f[t[i]][i]+=m;
f[i][t[i]]-=m;
}
}
}
void crit(int nn,int d[]){
int i,cap=1,coada=1,nod;
d[1]=nn;
for(i=1;i<=n;i++)
fol[i]=0;
fol[nn]=1;
while(cap<=coada){
nod=d[cap];
for(i=1;i<=nv[nod];i++)
if(fol[v[nod][i]]==0 && c[nod][v[nod][i]]-inv(f[nod][v[nod][i]])>0){
coada++;
d[coada]=v[nod][i];
fol[v[nod][i]]=1;
}
cap++;
}
for(i=1;i<=n;i++)
d[i]=fol[i];
}
int main(){
int x,y,i,nr=0,c;
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&c);
funct(x,y,c);
x2[i]=x;
y2[i]=y;
}
solve();
crit(1,v1);
crit(n,v2);
for (i=1;i<=m;i++){
x=x2[i];
y=y2[i];
if ((v1[x]^v2[x]) && (v1[y]^v2[y]) && (v2[x]^v2[y]))
nr++;
}
printf("%d\n",nr);
for (i=1;i<=m;i++){
x=x2[i];
y=y2[i];
if ((v1[x]^v2[x]) && (v1[y]^v2[y]) && (v2[x]^v2[y]))
printf("%d\n",i);
}
return 0;
}