#include <cstdio>
#include <cstring>
const int maxn = 1001;
const int maxm = 10000;
FILE *in = fopen("critice.in","r"), *out = fopen("critice.out","w");
struct muchie
{
short x, y, c;
};
int n, m;
short *a[maxn];
short *b[maxn];
short f[maxn][maxn];
short viz[maxn];
short C[maxn];
muchie mc[maxm];
short crit[maxn];
void read()
{
fscanf(in, "%d %d", &n, &m);
short cnt[maxn];
for ( int i = 0; i < m; ++i )
{
fscanf(in, "%hd %hd %hd", &mc[i].x, &mc[i].y, &mc[i].c);
++cnt[ mc[i].x ], ++cnt[ mc[i].y ];
}
for ( int i = 1; i <= n; ++i )
{
a[i] = new short[ cnt[i]+1 ], b[i] = new short[ cnt[i]+1 ];
a[i][0] = b[i][0] = cnt[i];
cnt[i] = 0;
}
for ( int i = 0; i < m; ++i )
{
int x = mc[i].x, y = mc[i].y;
++cnt[x], ++cnt[y];
a[x][ cnt[x] ] = mc[i].c, b[x][ cnt[x] ] = y;
a[y][ cnt[y] ] = mc[i].c, b[y][ cnt[y] ] = x;
}
}
int findway()
{
int p = 0, u = 0;
memset(viz, 0, sizeof(viz));
int x = 0;
C[p] = 1;
while ( p <= u && !viz[n] )
{
x = C[p++];
for ( int i = 1; i <= a[x][0]; ++i )
if ( !viz[b[x][i]] )
if ( f[x][ b[x][i] ] < a[x][i] )
viz[b[x][i]] = x, C[++u] = b[x][i];
}
return viz[n];
}
inline int min(int x, int y)
{
return x < y ? x : y;
}
void flux()
{
int L[maxn];
while ( findway() )
{
int lg = 0;
L[lg] = n;
int p = maxm << 1;
while ( L[lg] != 1 )
{
++lg;
L[lg] = viz[ L[lg-1] ];
int k = 1;
while ( b[ L[lg] ][k] != L[lg - 1] )
++k;
p = min(p, a[ L[lg] ][ k ] - f[ L[lg] ][ L[lg-1] ]);
}
for ( int i = lg; i; --i )
f[ L[i] ][ L[i-1] ] += p, f[ L[i-1] ][ L[i] ] = -f[ L[i] ][ L[i-1] ];
}
}
void BF(int s)
{
int p = 0, u = 0;
memset(viz, 0, sizeof(viz));
int x = 0;
viz[s] = 1;
C[p] = s;
crit[s] = s;
while ( p <= u )
{
x = C[p++];
for ( int i = 1; i <= a[x][0]; ++i )
{
int k = 1;
while ( b[ b[x][i] ][k] != x )
++k;
if ( !viz[ b[x][i] ] && f[ x ][ b[x][i] ] < a[x][i] && f[ b[x][i] ][ x ] < a[ b[x][i] ][k] )
viz[ b[x][i] ] = 1, crit[ b[x][i] ] = s, C[++u] = b[x][i];
}
}
}
int main()
{
read();
flux();
BF(1);
BF(n);
int cnt = 0;
int answ[maxm];
// for ( int i = 1; i <= n; ++i )
// {
// for ( int j = 1; j <= a[i][0]; ++j )
// printf("%d ", b[i][j]);
// printf("\n");
// }
// printf("\n");
for ( int i = 0; i < m; ++i )
if ( crit[ mc[i].x ] && crit[ mc[i].y ] && crit[ mc[i].x ] != crit[ mc[i].y ] )
answ[cnt++] = i+1;
#define fout out
fprintf(fout, "%d\n", cnt);
for ( int i = 0; i < cnt; ++i )
fprintf(fout, "%d\n", answ[i]);
return 0;
}
//#include <cstdio>
//#include <cstring>
//
//const int maxn = 1001;
//const int maxm = 10000;
//
//FILE *in = fopen("critice.in","r"), *out = fopen("critice.out","w");
//
//struct muchie
//{
// short x, y;
//};
//
//int n, m;
//short a[maxn][maxn];
//short f[maxn][maxn];
//
//short viz[maxn];
//short C[maxn];
//
//muchie mc[maxm];
//short crit[maxn];
//
//
//void read()
//{
// fscanf(in, "%d %d", &n, &m);
//
// for ( int i = 0; i < m; ++i )
// {
// fscanf(in, "%hd %hd", &mc[i].x, &mc[i].y);
// fscanf(in, "%hd\n", &a[ mc[i].x ][ mc[i].y ]);
//
// a[ mc[i].y ][ mc[i].x ] = a[ mc[i].x ][ mc[i].y ];
// }
//}
//
//int findway()
//{
// int p = 0, u = 0;
// memset(viz, 0, sizeof(viz));
//
// int x = 0;
// C[p] = 1;
//
// while ( p <= u && !viz[n] )
// {
// x = C[p++];
//
// for ( int i = 1; i <= n; ++i )
// if ( !viz[i] )
// if ( f[x][i] < a[x][i] )
// viz[i] = x, C[++u] = i;
// }
//
// return viz[n];
//}
//
//inline int min(int x, int y)
//{
// return x < y ? x : y;
//}
//
//void flux()
//{
// int L[maxn];
//
// while ( findway() )
// {
// int lg = 0;
// L[lg] = n;
//
// int p = maxm;
// while ( L[lg] != 1 )
// {
// ++lg;
// L[lg] = viz[ L[lg-1] ];
//
// p = min(p, a[ L[lg] ][ L[lg-1] ] - f[ L[lg] ][ L[lg-1] ]);
// }
//
// for ( int i = lg; i; --i )
// f[ L[i] ][ L[i-1] ] += p, f[ L[i-1] ][ L[i] ] = -f[ L[i] ][ L[i-1] ];
// }
//}
//
//void BF(int s)
//{
// int p = 0, u = 0;
// memset(viz, 0, sizeof(viz));
//
// int x = 0;
// viz[s] = 1;
// C[p] = s;
// crit[s] = s;
//
// while ( p <= u )
// {
// x = C[p++];
//
// for ( int i = 1; i <= n; ++i )
// if ( !viz[i] && f[x][i] < a[x][i] && f[i][x] < a[i][x] )
// viz[i] = 1, crit[i] = s, C[++u] = i;
// }
//}
//
//int main()
//{
// read();
// flux();
//
// BF(1);
// BF(n);
//
// int cnt = 0;
// int answ[maxm];
// for ( int i = 1; i <= n; ++i )
// {
// for ( int j = 1; j <= n; ++j )
// fprintf(out,"%d ", f[i][j]);
// fprintf(out,"\n");
//
// }
// for ( int i = 0; i < m; ++i )
// if ( crit[ mc[i].x ] && crit[ mc[i].y ] && crit[ mc[i].x ] != crit[ mc[i].y ] )
// answ[cnt++] = i+1;
//
// fprintf(out, "%d\n", cnt);
// for ( int i = 0; i < cnt; ++i )
// fprintf(out, "%d\n", answ[i]);
//
// return 0;
//}