#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 1004
#define MMAX 10002
#define oo 10005
vector < pair<int,int> > M;
vector <int> A[NMAX];
int nm,n,m;
bool vb[NMAX][2];
int viz[NMAX],C[NMAX][NMAX],F[NMAX][NMAX],nv[NMAX],Q[NMAX],sol[MMAX];
void citire()
{ int i;
freopen("critice.in","r",stdin);
scanf("%d %d",&n,&m);
for (i=1;i<=m;++i)
{ int x,y,ct;
scanf("%d %d %d",&x,&y,&ct);
M.push_back( make_pair(x,y) );
C[x][y]=C[y][x]=ct;
A[x].push_back(y); nv[x]++;
A[y].push_back(x); nv[y]++;
}
}
bool bfs()
{
int st,dr,x,i;
st=dr=0; Q[0]=1;
while (st<=dr)
{
x=Q[st++];
if (x==n) continue;
for (i=0;i<nv[x];++i)
if (!viz[A[x][i]] && C[x][A[x][i]]>F[x][A[x][i]])
{
viz[A[x][i]]=x;
Q[++dr]=A[x][i];
}
}
return viz[n];
}
void Flux()
{ int i,j;
memset(viz,0,sizeof(viz));
while (bfs())
{
for (i=0;i<nv[n];++i)
if (F[A[n][i]][n]<C[A[n][i]][n] && viz[A[n][i]])
{
viz[n]=A[n][i];
int flux=oo;
for (j=n;j>1;j=viz[j])
flux=min(flux,C[viz[j]][j]-F[viz[j]][j]);
for (j=n;j>1;j=viz[j])
{
F[viz[j]][j]+=flux;
F[j][viz[j]]-=flux;
}
}
memset(viz,0,sizeof(viz));
}
}
void bf(int s, int d, short v)
{
int st,dr,i,x;
st=dr=0; Q[0]=s; vb[s][v]=1;
while (st<=dr)
{
x=Q[st++];
if (x==d) continue;
for (i=0;i<nv[x];++i)
if (!vb[A[x][i]][v] && C[x][A[x][i]]>F[x][A[x][i]] && C[A[x][i]][x]>F[A[x][i]][x])
{
vb[A[x][i]][v]=1;
Q[++dr]=A[x][i];
}
}
}
void afisare()
{
freopen("critice.out","w",stdout);
printf("%d\n",nm);
int i;
for (i=1;i<=nm;++i)
printf("%d\n",sol[i]);
}
int main()
{
citire();
Flux();
memset(vb,0,sizeof(vb));
bf(1,n,0);
bf(n,1,1);
int i,x,y;
nm=0;
for (i=0;i<m;++i)
{
x=M[i].first; y=M[i].second;
if ( F[x][y]==C[x][y])
if ((vb[x][0]&&!vb[x][1]) && (vb[y][1]&&!vb[y][0]) )
{ sol[++nm]=i+1; continue;}
if (F[y][x]==C[y][x])
if ((vb[y][0]&&!vb[y][1]) && (vb[x][1]&&!vb[x][0]) )
{ sol[++nm]=i+1;}
}
afisare();
return 0;
}