using namespace std;
#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstdlib>
#include <utility>
#include <algorithm>
#include <functional>
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define C(v) memset((v),0,sizeof((v)))
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)
#define mp make_pair
#define IN "critice.in"
#define OUT "critice.out"
#define N_MAX 1<<10
typedef vector< pair<int,int> > VI;
typedef vector< vector <int> > VM;
typedef vector<string> VS;
int S,D,N,M;
vector< vector<int> > A(N_MAX);
int T[N_MAX],I[N_MAX][N_MAX],C[N_MAX][N_MAX];
bool viz[N_MAX];
VI MV;
II void scan()
{
int x,y,c;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d%d",&N,&M);
FOR(i,1,M)
{
scanf("%d%d%d\n",&x,&y,&c);
A[x].pb(y);
A[y].pb(x);
C[x][y] = C[y][x] = c;
I[x][y] = I[y][x] = i;
MV.pb( mp(x,y) );
}
S=1;
D=N;
}
II void BF(int start)
{
int stv[N_MAX];
stv[stv[0] = 1] = start;
viz[start] = true;
FOR(i,1,stv[0])
{
int nod = stv[i];
int l = A[nod].sz() - 1;
FOR(j,0,l)
{
int next = A[nod][j];
if(!viz[next] && C[nod][next])
{
viz[next] = true;
T[next] = nod;
stv[++stv[0]] = next;
}
}
}
}
II int flux()
{
int r(1<<30);
C(viz);
viz[S] = true;
T[D] = 0;
BF(S);
if(!T[D])
return 0;
for(int j=N;j!=S;j = T[j])
r = min(r, C[ T[j] ][j]);
for(int j=N; j!= S; j = T[j])
{
C[ T[j] ][j] -= r;
C[j][ T[j] ] += r;
}
return 1;
}
II void solve()
{
for(;flux(););
int sol[N_MAX],stv[N_MAX];
bool vizS[N_MAX],vizD[N_MAX];
sol[0] = 0;
C(vizS),C(vizD);
stv[stv[0] = 1] = S;
vizS[S] = true;
FOR(i,1,stv[0])
{
int nod = stv[i];
int l = A[nod].sz() - 1;
FOR(j,0,l)
{
int next = A[nod][j];
if(!vizS[next] && C[nod][next])
vizS[next] = true,
stv[++stv[0]] = next;
}
}
stv[stv[0] = 1] = D;
vizD[D] = true;
FOR(i,1,stv[0])
{
int nod = stv[i];
int l = A[nod].sz() - 1;
FOR(j,0,l)
{
int next = A[nod][j];
if(!vizD[next] && C[next][nod])
vizD[next] = true,
stv[++stv[0]] = next;
}
}
FOR(i,0,M-1)
if( (vizS[ MV[i].f ] && vizD[ MV[i].s] && !C[ MV[i].f ][ MV[i].s ]) || (vizS[ MV[i].s ] && vizD[ MV[i].f ] && !C[ MV[i].s ][ MV[i].f ]) )
sol[++sol[0]] = i+1;
printf("%d\n",sol[0]);
FOR(i,1,sol[0])
printf("%d\n",sol[i]);
}
int main()
{
scan();
solve();
return 0;
}