#include<stdio.h>
#include<math.h>
#include<iomanip.h>
#define dim 1001
#define dim1 10001
typedef struct nod{
int info,ind;
nod*urm;
}*pnod,NOD;
pnod l[dim1];
pnod l1[dim1];
int c[dim][dim],f[dim][dim],s[dim],t[dim];
int q[dim],cr[dim];
int a[dim],b[dim],solutia[dim];
int n,m,flow;
int o[dim][dim];
int s1[dim],s2[dim];
int c2[dim];
void citire();
int flux();
int min(int ,int);
void afisare();
void dfs(int nod);
void dfd(int );
void bellmanford();
void drum();
void solve();
void add(int ,int ,int );
void add1(int ,int ,int );
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
citire();
bellmanford();
solve();
return 0;
}
void citire()
{
scanf("%d %d",&n,&m);
//printf("%d %d\n",n,m);
int i,cost,x,y;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&cost);
c[x][y]=c[y][x]=cost;
add(x,y,i);
add(y,x,i);
//printf("%d %d %d\n",x[i],y[i],cost);
}
}
void add(int i,int j,int ind)
{
pnod p=new NOD;
p->info=j;
p->urm=l[i];
p->ind=ind;
l[i]=p;
}
void add1(int i,int j,int ind)
{
pnod p=new NOD;
p->info=j;
p->ind=ind;
p->urm=l[i];
l[i]=p;
}
int flux()
{
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
memset(cr,0,sizeof(cr));
memset(q,0,sizeof(q));
int prim,ultim,i,j;
prim=ultim=1;
s[1]=1;
t[1]=0;
cr[1]=32000;
q[1]=1;
while(prim<=ultim)
{
i = q[prim];
for ( pnod p = l[i]; p; p = p->urm )
if ( !s[p->info] )
{
j = p->info;
if ( c[i][j] > f[i][j] )
{
if ( c[i][j] - f[i][j] < cr[i] )
cr[j] = c[i][j] - f[i][j];
else
cr[j] = cr[i];
s[j] = 1;
t[j] = i;
q[++ultim] = j;
if ( j == n )
return 1;
}
if ( f[j][i] > 0 )
{
if ( cr[i] < f[j][i] )
cr[j] = cr[i];
else
cr[j] = f[j][i];
s[j] = 1;
t[j] = -i;
q[++ultim] = j;
if ( j == n )
return 1;
}
}
prim++;
}
return 0;
}
void bellmanford()
{
while(flux())
drum();
}
void dfs(int nod)
{
s1[nod]=1;
for(pnod p=l[nod];p;p=p->urm)
if(!s1[nod] && o[nod][p->info]!=-1)
dfs(p->info);
}
void dfd(int nod)
{
s2[nod]=1;
for(pnod p=l[nod];p;p=p->urm)
if(!s2[nod] && o[nod][p->info]!=-1)
dfd(p->info);
}
void solve()
{
int i,j,nre=0,x,y,nr=0,nrsol2=0;
for(i=1;i<=n;i++)
for(pnod p=l[i];p;p=p->urm)
if(c[i][p->info]!=f[i][p->info])
{
add(i,p->info,1);
add(p->info,i,1);
//printf("%d %d\n",i,p->info);
}
else
{
nre++;
add(i,p->info,-1);
add(p->info,i,-1);
o[p->info][i]=o[i][p->info]=-1;
a[nre]=i;
b[nre]=p->info;
c2[nre]=p->ind;
}
dfs(1);
dfd(n);
int ind=0;
for(i=1;i<=m;i++)
{
x=a[i];
y=b[i];
ind=0;
if((s1[x]==1 && s2[y]==1)||(s1[y]==1 ||s2[x]==1))
ind=2;
if(ind==0)
solutia[c2[i]]=1;
}
//printf("%d\n",nrsol2);
for(i=1;i<=m;i++)
if(solutia[i])
nrsol2++;
printf("%d\n",nrsol2);
for(i=1;i<=m;i++)
if(solutia[i])
printf("%d\n",i);
}
void drum()
{
int i,j;
i=n;
while(i)
{
j=abs(t[i]);
if(t[i]>0) f[j][i]++;
else
f[i][j]--;
i=j;
}
flow++;
}
void afisare()
{
printf("%d\n",flow);
int i,j,nrsol=0,nr1=0,nr2=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",f[i][j]);
printf("\n");
}
printf("%\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",c[i][j]);
printf("\n");
}
//intf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(f[i][j]==c[i][j] && c[i][j]!=0)
{
nrsol++;
a[++nr1]=i;
b[++nr2]=j;
//printf("%d %d\n",i,j);
}
}
//printf("%d\n",nrsol);
}