#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define N 1010
#define M 10010
#define INF 0X3f3f3f3f
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n,m,i,x,y,d,mini,nod,nrsol,sol[M],t[N],viz[N],viz1[N],viz2[N],cap[N][N],fl[N][N];
vector<int>v[N];
pair<int,int>mu[M];
queue<int>q;
inline bool bfs(){
memset(viz,0,sizeof(viz));
viz[1]=1;
q.push(1);
while(!q.empty())
{
x=q.front();
q.pop();
if(x==n)
continue;
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
if(cap[x][*it]-fl[x][*it]>0&&!viz[*it])
{
viz[*it]=1;
q.push(*it);
t[*it]=x;
}
}
return viz[n];
}
inline void fa_flux(){
while(bfs())
{
for(vector<int>::iterator it=v[n].begin();it!=v[n].end();++it)
if(viz[*it]&&cap[*it][n]-fl[*it][n]>0)
{
t[n]=*it;
mini=INF;
nod=n;
while(nod!=1)
{
mini=min(mini,cap[t[nod]][nod]-fl[t[nod]][nod]);
nod=t[nod];
}
if(!mini)
continue;
nod=n;
while(nod!=1)
{
fl[t[nod]][nod]+=mini;
fl[nod][t[nod]]-=mini;
nod=t[nod];
}
}
}
}
inline void dfs(int x,int viz[]){
viz[x]=1;
for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
if(!viz[*it]&&fl[x][*it]!=cap[x][*it]&&fl[x][*it]!=-cap[x][*it])
dfs(*it,viz);
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y>>d;
cap[x][y]=cap[y][x]=d;
v[x].push_back(y);
v[y].push_back(x);
mu[i]=make_pair(x,y);
}
fa_flux();
dfs(1,viz1);
dfs(n,viz2);
for(i=1;i<=m;++i)
if(viz1[mu[i].first]&&viz2[mu[i].second]||viz1[mu[i].second]&&viz2[mu[i].first])
if(fl[mu[i].first][mu[i].second]==cap[mu[i].first][mu[i].second]||fl[mu[i].second][mu[i].first]==cap[mu[i].first][mu[i].second])
sol[++nrsol]=i;
g<<nrsol<<'\n';
for(i=1;i<=nrsol;++i)
g<<sol[i]<<'\n';
return 0;
}