#include <cstdio>
#include <vector>
#define Nmax 1005
#define Mmax 10005
#define INF 2000000000
using namespace std;
int N,C[Nmax][Nmax],F[Nmax][Nmax],tata[Nmax],Q[Nmax],sol[Mmax],t[Nmax],ij;
bool viz[Nmax],saturat[Nmax][Nmax];
vector <int> L[Nmax];
struct edge
{
int x,y;
};
edge a[Mmax];
inline bool Bfs()
{
int i,nod,n,len,st,dr;
for(i=2;i<=N;++i)
viz[i]=false;
viz[1]=true;
st=dr=Q[1]=1;
while(st<=dr)
{
nod=Q[st++];
if(nod==N)
continue;
len=L[nod].size();
for(i=0;i<len;++i)
{
n=L[nod][i];
if(!viz[n] && F[nod][n]<C[nod][n])
{
viz[n]=true;
tata[n]=nod;
Q[++dr]=n;
}
}
}
return viz[N];
}
inline void MaxFlow()
{
int n,i,len,minflow;
while(Bfs())
{
len=L[N].size();
for(i=0;i<len;++i)
{
n=L[N][i];
if(viz[n] && C[n][N]>F[n][N])
{
tata[N]=n;
minflow=INF;
for(n=N;tata[n];n=tata[n])
minflow=min(minflow,C[tata[n]][n]-F[tata[n]][n]);
if(!minflow)
continue;
for(n=N;tata[n];n=tata[n])
{
F[tata[n]][n]+=minflow;
F[n][tata[n]]-=minflow;
}
}
}
}
}
inline bool Dfs(int a, int b, int cnt)
{
int i,len,n;
if(a==b)
return true;
t[a]=cnt;
len=L[a].size();
for(i=0;i<len;++i)
{
n=L[a][i];
if(t[n]!=cnt && !saturat[a][n])
if(Dfs(n,b,cnt))
return true;
}
return false;
}
int main()
{
int M,x,y,z,i;
freopen ("critice.in","r",stdin);
freopen ("critice.out","w",stdout);
scanf("%d%d", &N,&M);
for(i=1;i<=M;++i)
{
scanf("%d%d%d", &a[i].x,&a[i].y,&z);
L[a[i].x].push_back(a[i].y);
L[a[i].y].push_back(a[i].x);
C[a[i].x][a[i].y]=C[a[i].y][a[i].x]=z;
}
MaxFlow();
for(i=1;i<=M;++i)
{
if(C[a[i].x][a[i].y]==F[a[i].x][a[i].y])
saturat[a[i].x][a[i].y]=true;
if(C[a[i].y][a[i].x]==F[a[i].y][a[i].x])
saturat[a[i].y][a[i].x]=true;
}
for(i=1;i<=M;++i)
if(saturat[a[i].x][a[i].y] || saturat[a[i].y][a[i].x])
if((Dfs(1,a[i].x,++ij) && Dfs(N,a[i].y,++ij)) || (Dfs(1,a[i].y,++ij) && Dfs(N,a[i].x,++ij)))
sol[++sol[0]]=i;
for(i=0;i<=sol[0];++i)
printf("%d\n", sol[i]);
return 0;
}