Cod sursa(job #220557)
#include<stdio.h>
#define lg 1005
int n, m, i, d[lg][lg], v[lg][lg], mc[lg*10][2], x, y, c, sol[lg*10], q[lg], tt[2][lg][lg], f;
int find(int s){
int fst[lg] = {0}, p = 0, r = 1, x, i, prd[lg] = {0};
if (!s)
q[r] = 1;
else
q[r] = n;
fst[q[r]] = 1;
while (p < r){
x = q[++ p];
//printf("%d\n", x);
for (i = 1; i <= v[x][0]; i ++){
int go = 0;
if (!s && d[x][v[x][i]] > 0)
go = 1;
if (s == 1 && d[v[x][i]][x] > 0)
go = 1;
if (!go && f == 1)
tt[s][x][v[x][i]] = 1;
if (go == 1 && !fst[v[x][i]]){
fst[v[x][i]] = 1;
prd[v[x][i]] = x;
q[++ r] = v[x][i];
if (s == 0 && v[x][i] == n){
p = r;
break;
}
}
}
}
if (f == 1)
return 0;
int mn = 0x3f3f3f3f;
for (x = n; prd[x]; x = prd[x])
mn = d[prd[x]][x] < mn ? d[prd[x]][x] : mn;
if (mn == 0x3f3f3f3f)
return 0;
for (x = n; prd[x]; x = prd[x]){
d[prd[x]][x] -= mn;
d[x][prd[x]] += mn;
}
return mn;
}
int main()
{
freopen("critice.in", "rt", stdin);
freopen("critice.out", "wt", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i <= m; i ++){
scanf("%d%d%d", &x, &y, &c);
d[x][y] = d[y][x] = c;
v[x][++ v[x][0]] = y;
v[y][++ v[y][0]] = x;
mc[i][0] = x, mc[i][1] = y;
}
do{
x = find(0);
// printf("%d\n", x);
}
while (x);
f = 1;
find(0);
find(1);
/*
for (i = 1; i <= n; i ++)
if (tt[0][i])
printf(" %d\n", i);
*/
for (i = 1; i <= m; i ++){
x = mc[i][0], y = mc[i][1];
if ((tt[0][x][y] == 1 && tt[1][y][x] == 1) || (tt[0][y][x] == 1 && tt[1][x][y] == 1))
sol[++ sol[0]] = i;
}
printf("%d\n", sol[0]);
for (i = 1; i <= sol[0]; i ++)
printf("%d\n", sol[i]);
return 0;
}