var c,f,idx:array[1..1000,1..1000] of integer;
viz,q,a,b:array[1..1000] of integer;
max,n,nsol,m,i,j,k,x,y,cost:integer;
fi:text;
function parcurge(x:integer):boolean;
var i,j,k,vf:integer;
begin
parcurge:=true;
fillchar(viz,sizeof(viz),0);
viz[x]:=-1;
i:=1; j:=1;
q[1]:=x;
while i<=j do
begin
vf:=q[i];
for k:=1 to n do
if (c[vf,k]-f[vf,k]>0) and (viz[k]=0) then
begin
inc(j);
q[j]:=k;
viz[k]:=vf;
if k=n then exit;
end;
inc(i);
end;
parcurge:=false;
end;
function detmax(x:integer):integer;
var m,ma:integer;
begin
ma:=c[viz[x],x]-f[viz[x],x];
if viz[x]=1 then detmax:=ma
else
begin
m:=detmax(viz[x]);
if m<ma then detmax:=m else detmax:=ma;
end;
end;
procedure cresteflux(x,max:integer);
begin
if x<>1 then
begin
f[viz[x],x]:=f[viz[x],x]+max;
f[x,viz[x]]:=-f[viz[x],x];
cresteflux(viz[x],max);
end;
end;
procedure p1;
var i,j,k,vf:integer;
begin
a[1]:=1;
fillchar(viz,sizeof(viz),0);
viz[1]:=-1;
i:=1; j:=1;
q[1]:=1;
while i<=j do
begin
vf:=q[i];
for k:=1 to n do
if (c[vf,k]-f[vf,k]>0) and (viz[k]=0) then
begin
inc(j);
q[j]:=k;
viz[k]:=vf;
a[k]:=1;
end;
inc(i);
end;
end;
procedure pn;
var i,j,k,vf:integer;
begin
b[n]:=1;
fillchar(viz,sizeof(viz),0);
viz[n]:=-1;
i:=1; j:=1;
q[1]:=n;
while i<=j do
begin
vf:=q[i];
for k:=1 to n do
if (c[k,vf]-f[k,vf]>0) and (viz[k]=0) then
begin
inc(j);
q[j]:=k;
viz[k]:=vf;
b[k]:=1;
end;
inc(i);
end;
end;
begin
assign(fi,'critice.in'); reset(fi);
readln(fi,n,m);
fillchar(c,sizeof(c),0);
fillchar(f,sizeof(f),0);
for i:=1 to m do
begin
readln(fi,x,y,cost);
c[x,y]:=cost;
c[y,x]:=cost;
idx[x,y]:=i;
idx[y,x]:=i;
end;
close(fi);
repeat
if parcurge(1) then
begin
max:=detmax(n);
cresteflux(n,max);
end
else break;
until 1=0;
p1;
pn;
fillchar(q,sizeof(q),0);
assign(fi,'critice.out'); rewrite(fi);
for i:=1 to n do
for j:=1 to n do
if (c[i,j]>0) and (c[i,j]=f[i,j]) and (a[i]+b[j]=2) then
begin
inc(nsol);
q[nsol]:=idx[i,j];
end;
for i:=1 to nsol-1 do
for j:=i+1 to nsol do
if q[i]>q[j] then
begin
max:=q[i];
q[i]:=q[j];
q[j]:=max;
end;
writeln(fi,nsol);
for i:=1 to nsol do writeln(fi,q[i]);
close(fi);
end.