Cod sursa(job #17410)
#include <cstdio>
#include <memory>
using namespace std;
const char iname[] = "critice.in";
const char oname[] = "critice.out";
#define MAXN 1001
#define MAXM 10000
struct edge {
int from;
int to;
} E[MAXM];
int N, M;
int deg[MAXN];
int C[MAXN][MAXN];
int G[MAXN][MAXN];
void read_data(void)
{
int i;
int x, y, z;
freopen(iname, "r", stdin);
scanf("%d %d\n", &N, &M);
for (i = 0; i < M; ++i) {
scanf("%d %d %d\n", &x, &y, &z);
/* memoreaza capacitatea */
C[x][y] = C[y][x] = z;
/* adauga in graf muchia (u,v) */
G[x][++G[x][0]] = y;
G[y][++G[y][0]] = x;
/* adauga muchia (u,v) in lista E */
E[i].from = x, E[i].to = y;
}
}
int F[MAXN][MAXN];
int Q[MAXN], D[MAXN], P[MAXN];
void BF(void)
{
int step;
int l, r, x, y;
memset(D, 0, sizeof(D));
memset(P, 0, sizeof(P));
for (D[1] = step = 1, Q[l = r = 0] = 1; l <= r; ++step) {
for (; l <= r && D[Q[l]] == step; ++l) {
x = Q[l];
for (y = 1; y <= G[x][0]; ++y)
if (D[ G[x][y] ] == 0)
if (F[x][ G[x][y] ] < C[x][ G[x][y] ]) {
D[ Q[++r] = G[x][y] ] = step + 1;
P[ G[x][y] ] = x;
if (G[x][y] == N)
return;
}
}
}
}
void flow(void)
{
int i;
int key;
for (BF(); P[N]; BF())
{
key = int(1e8);
for (i = N; i != 1; i = P[i])
if (key > C[ P[i] ][i] - F[ P[i] ][i])
key = C[ P[i] ][i] - F[ P[i] ][i];
for (i = N; i != 1; i = P[i])
F[ P[i] ][i] += key,
F[i][ P[i] ] -= key;
}
}
#define modul(z) ((z) < 0 ? (-(z)) : (z))
void BFGR(int s, int cnt) /* breath - first in graful rezidual */
{
int l, r;
int i, x, y;
for (Q[l = r = 0] = s, D[s] = cnt; l <= r; ) {
for (i = r-l+1; i--; ++l) {
x = Q[l];
for (y = 1; y <= G[x][0]; ++y)
if (D[ G[x][y] ] == 0)
if (C[x][ G[x][y] ] > modul(F[x][ G[x][y] ]))
D[ Q[++r] = G[x][y] ] = cnt;
}
}
}
int main(void)
{
read_data();
flow();
freopen(oname, "w", stdout);
memset(D, 0, sizeof(D));
BFGR(1, 1);
BFGR(N, 2);
int cnt = 0;
for (int i = 0; i < M; ++i)
if (D[E[i].from] + D[E[i].to] == 3)
++cnt;
freopen(oname, "w", stdout);
printf("%d\n", cnt);
for (int i = 0; i < M; ++i)
if (D[E[i].from] + D[E[i].to] == 3)
printf("%d\n", i+1);
return 0;
}