//#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;
// viz[1] = 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];
// else if ( f[ b[x][i] ][x] > 0 )
// 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;
//}
//
//inline int abs(int x)
//{
// return x < 0 ? -x : x;
//}
//
//void flux()
//{
// int L[maxn];
//
// while ( findway() )
// {
// int lg = 0;
// L[lg] = n;
//
// int p = maxm << 1, q = maxm << 1, v = 0;
// while ( L[lg] != 1 )
// {
// ++lg;
// L[lg] = abs(viz[ L[lg-1] ]);
// if ( viz[ L[lg-1] ] > 0 )
// p = min(p, a[ L[lg] ][ L[lg-1] ] - f[ L[lg] ][ L[lg-1] ]);
// else if ( viz[ L[lg-1] ] < 0 )
// q = min(q, f[ L[lg-1] ][ L[lg] ]);
// }
//
// v = min(p, q);
//
// for ( int i = lg; i; --i )
// if ( viz[ L[i-1] ] > 0 )
// f[ L[i] ][ L[i-1] ] += v, 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 )
// 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 <= 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;
//
// fprintf(stdout, "%d\n", cnt);
// for ( int i = 0; i < cnt; ++i )
// fprintf(stdout, "%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] ];
if ( viz[ L[lg-1] ] > 0 )
p = min(p, a[ L[lg] ][ L[lg-1] ] - f[ L[lg] ][ L[lg-1] ]);
}
for ( int i = lg; i; --i )
if ( viz[ L[i-1] ] > 0 )
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 = 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;
}