#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define nmax 1005
#define mmax 10001
using namespace std;
FILE *fo=fopen("critice.in","r"),*g=fopen("critice.out","w");
vector <int> l[nmax];
struct muc{
int x,y;
}mucs[mmax];
int c[nmax][nmax],f[nmax][nmax],t[nmax],n,s,d,vizi[3][nmax],r[mmax],k;
int bf()
{
queue <int> q;
int i,j,x,ok=0;
for(i=1;i<=n;i++)
t[i]=0;
t[s]=-1;
q.push(1);
for(;!q.empty();q.pop())
{
x=q.front();
for(i=0;i<l[x].size();i++)
{
j=l[x][i];
if(t[j]==0&&c[x][j]>f[x][j])
{
if(j!=d)
{
t[j]=x;
q.push(j);
}
else
ok=1;
}
}
}
return ok;
}
void dinic()
{
int i,j,pas,mini,h;
for(pas=bf();pas>0;pas=bf())
{
for(i=0;i<l[d].size();i++)
{
j=l[d][i];
if(t[j]!=0&&c[j][d]>f[j][d])
{
mini=nmax+5;
t[d]=j;
for(h=d;h!=s;h=t[h])
mini=min(mini,c[t[h]][h]-f[t[h]][h]);
if(mini>0)
for(h=d;h!=s;h=t[h])
{
f[t[h]][h]+=mini;
f[h][t[h]]-=mini;
}
}
}
}
}
void bfs(int x,int ind)
{
queue <int> q;
int i,j,h;
q.push(x);
vizi[ind][x]=1;
for(;!q.empty();q.pop())
{
x=q.front();
for(i=0;i<l[x].size();i++)
{
j=l[x][i];
if(vizi[ind][j]==0&&c[x][j]>abs(f[x][j]))
{
vizi[ind][j]=1;
q.push(j);
}
}
}
}
int main()
{
int i,j,x,y,m;
fscanf(fo,"%d %d",&n,&m);
s=1; d=n;
for(i=1;i<=m;i++)
{
fscanf(fo,"%d %d",&x,&y);
mucs[i].x=x;
mucs[i].y=y;
fscanf(fo,"%d",&c[x][y]);
c[y][x]=c[x][y];
l[x].push_back(y);
l[y].push_back(x);
}
dinic();
bfs(s,1);
bfs(d,2);
//cout<<flux;
for(i=1;i<=m;i++)
{
int z,zz;
z=mucs[i].x; zz=mucs[i].y;
if(((vizi[1][z]&&vizi[2][zz])||(vizi[2][z]&&vizi[1][zz]))&&c[z][zz]==abs(f[z][zz]))
r[++k]=i;
}
fprintf(g,"%d\n",k);
for(i=1;i<=k;i++)
fprintf(g,"%d\n",r[i]);
fclose(fo);
fclose(g);
return 0;
}