#include<cstdio>
#include<vector>
#include<cstring>
#define MAXN 2010
#define inf 2000000010
using namespace std;
vector<int> g[MAXN],solution;
vector<pair<int,int> > edges;
int capacity[MAXN][MAXN],flow[MAXN][MAXN],source,sink;
int dad[MAXN],Queue[MAXN],seen[MAXN];
int minimum(int a,int b){
if(a<b)
return a;
return b;
}
bool FirstBFS(){
int node,i,left=1,right=1;
memset(seen,0,sizeof(seen));
seen[source]=1;
Queue[1]=source;
while(left<=right){
node=Queue[left];
left++;
if(node==sink)
continue;
for(i=0;i<g[node].size();i++){
if(seen[g[node][i]]==1||capacity[node][g[node][i]]==flow[node][g[node][i]])
continue;
seen[g[node][i]]=1;
right++;
Queue[right]=g[node][i];
dad[g[node][i]]=node;
}
}
if(seen[sink]==1)
return true;
return false;
}
void SecondBFS(int start,int value,bool ok){
int i,node,left=1,right=1;
Queue[left]=start;
seen[start]=value;
while(left<=right){
node=Queue[left];
left++;
for(i=0;i<g[node].size();i++)
if(ok==false&&seen[g[node][i]]!=value&&capacity[node][g[node][i]]>flow[node][g[node][i]]){
right++;
Queue[right]=g[node][i];
seen[g[node][i]]=value;
}
else
if(ok==true&&seen[g[node][i]]!=value&&capacity[g[node][i]][node]>flow[g[node][i]][node]){
right++;
Queue[right]=g[node][i];
seen[g[node][i]]=value;
}
}
}
int main(){
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
int n,m,i,x,y,c,maximumFlow=0,add,node;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&c);
g[x].push_back(y);
g[y].push_back(x);
capacity[x][y]+=c;
capacity[y][x]+=c;
edges.push_back(make_pair(x,y));
}
source=1;
sink=n;
while(FirstBFS()==true)
for(i=0;i<g[sink].size();i++){
if(seen[g[sink][i]]==0||capacity[g[sink][i]][sink]<=flow[g[sink][i]][sink])
continue;
dad[sink]=g[sink][i];
add=inf;
for(node=sink;node!=source;node=dad[node])
add=minimum(add,capacity[dad[node]][node]-flow[dad[node]][node]);
if(add==0)
continue;
for(node=sink;node!=source;node=dad[node]){
flow[dad[node]][node]+=add;
flow[node][dad[node]]-=add;
}
maximumFlow+=add;
}
memset(seen,0,sizeof(seen));
SecondBFS(source,1,false);
SecondBFS(sink,2,true);
for(i=0;i<m;i++)
if(seen[edges[i].first]+seen[edges[i].second]==3)
solution.push_back(i+1);
printf("%d\n",solution.size());
for(i=0;i<solution.size();i++)
printf("%d\n",solution[i]);
return 0;
}