#include <cstdio>
#include <string>
#define Max 0x3f3f3f3f
#define MaxN 1024
#define MaxM 10024
struct ord{
int x,y;
} p[MaxM];
int N,M,s[MaxN],uz[MaxN],a[MaxN][MaxN],f[MaxN],sol[MaxM],nr,sw=1,st,fi,min,c[MaxN];
void cit()
{
int i,x,y,c;
freopen("critice.in","r",stdin);
scanf("%d%d",&N,&M);
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&c);
p[i].x=x; p[i].y=y;
a[x][y]=a[y][x]=c;
}
st=1; fi=N;
}
int minim(int x,int y)
{
if(x<y)
return x;
return y;
}
void gasesc_drum()
{
int i,j,p=1,nodc,nod;
c[1]=st; uz[1]=1;
for(j=1;j<=p && !f[N];j++)
{
nodc=c[j];
for(i=1;i<=N && !f[N];i++)
{
if(f[i]==0 && a[nodc][i]>0)
{
f[i]=minim(a[nodc][i],f[nodc]);
s[i]=nodc;
c[++p]=i;
if(i==N)
{
j=p+1;
break;
}
}
}
}
if(!f[N])
{
sw=0;
return;
}
nod=N;
while(nod!=st)
{
i=s[nod];
a[i][nod]-=f[N];
a[nod][i]+=f[N];
nod=i;
}
}
void flux()
{
do{
memset(f,0,sizeof(f));
memset(s,-1,sizeof(s));
f[st]=Max;
gasesc_drum();
}while(sw);
}
void bf1(int nod)
{
int i,p=1,j,nodc;
memset(uz,0,sizeof(uz));
c[p]=nod; uz[nod]=1;
for(j=1;j<=p;j++)
{
nodc=c[j];
s[nodc]=1;
for(i=1;i<=N;i++)
if(a[nodc][i]>0 && !uz[i])
{
c[++p]=i;
uz[i]=1;
}
}
}
void bf2(int nod)
{
int i,p=1,j,nodc;
memset(uz,0,sizeof(uz));
c[p]=nod; uz[nod]=1;
for(j=1;j<=p;j++)
{
nodc=c[j];
s[nodc]=2;
for(i=1;i<=N;i++)
if(a[i][nodc]>0 && !uz[i])
{
c[++p]=i;
uz[i]=1;
}
}
}
void rez()
{
int i,x,y;
memset(s,0,sizeof(s));
bf1(1);
bf2(N);
for(i=1;i<=M;i++)
{
x=p[i].x; y=p[i].y;
if( (!a[x][y] && a[y][x] || !a[y][x] && a[x][y]) && s[x]+s[y]==3)
sol[++nr]=i;
}
}
void afis()
{
freopen("critice.out","w",stdout);
printf("%d\n",nr);
for(int i=1;i<=nr;i++)
printf("%d\n",sol[i]);
}
int main()
{
cit();
flux();
rez();
afis();
return 0;
}