#include <cstdio>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#define vv 1001
#define minim(x,y) ((x)<(y)?(x):(y))
using namespace std;
int c[vv][vv],f[vv][vv],v[vv],d[vv][vv];
int n,m;
queue <int> q,w,a;
stack <int> s;
vector <int> l;
void citire()
{
freopen("critice.in","r",stdin);
scanf("%d%d", &n, &m);
int x,y;
for (int i=1; i<=m; i++)
{
scanf("%d%d", &x, &y);
scanf("%d", &c[x][y]);
c[y][x]=c[x][y];
d[x][y]=d[y][x]=i;
}
}
int bf(int st,int w)
{
q.push(st);
memset(v,0,sizeof(v));
v[1]=st;
int e;
while (q.size())
{
e=q.front();
q.pop();
for (int i=1; i<=n; i++)
if (f[e][i]<c[e][i] && !v[i])
{
v[i]=e;
q.push(i);
}
}
return v[w];
}
void flux()
{
int a=20000;
//s.push(n);
int nod=n;
while (nod!=1)
{
a=minim(a,c[nod][v[nod]]-f[nod][v[nod]]);
s.push(nod);
nod=v[nod];
}
//s.push(1);
nod=1;
while (s.size())
{
f[nod][s.top()]+=a;
f[s.top()][nod]=f[nod][s.top()];
nod=s.top();
s.pop();
}
}
void afisare(int w[vv][vv])
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
printf("%d ",w[i][j]);
printf("\n");
}
printf("\n");
}
void critice()
{
while (w.size())
{
int p=a.front();
int o=w.front();
a.pop();
w.pop();
if (p==1 && bf(o,n))
//printf("%d %d\n",p,o);
l.push_back(d[p][o]);
else
if (o==1 && bf(p,n))
l.push_back(d[p][o]);
//printf("%d %d\n",p,o);
else
if (p==n && bf(1,o))
l.push_back(d[p][o]);
//printf("%d %d\n",p,o);
else
if (o==n && bf(1,p))
l.push_back(d[p][o]);
//printf("%d %d\n",p,o);
else
if ((bf(1,p) && bf(o,n)) || (bf(1,o) && bf(p,n)))
l.push_back(d[p][o]);
//printf("%d %d\n",p,o);
}
sort(l.begin(),l.end());
printf("%d\n", l.size());
for (vector <int> ::iterator it=l.begin(); it!=l.end(); it++)
printf("%d\n", *it);
}
int main()
{
citire();
//afisare(c);
while (bf(1,n))
flux();
//afisare(f);
for (int i=1; i<n; i++)
for (int j=i+1; j<=n; j++)
if (f[i][j]==c[i][j] && c[i][j])
{
//printf("%d %d\n",i,j);
a.push(i);
w.push(j);
c[i][j]=0;
}
freopen("critice.out","w",stdout);
critice();
return 0;
}