#include #include #include #include #include using namespace std; #define REP(i, n) for (int i = 0; i < int(n); i++) typedef pair PII; typedef vector VPII; typedef vector VI; typedef vector VVI; typedef vector VB; const int INF = 12345678; int solve(VVI &d) { const int N = d.size(); REP (k, N) REP (i, N) REP (j, N) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); #define ENCODE(p1, p2) ((p1) * N + (p2)) #define DECODE1(p) ((p) / N) #define DECODE2(p) ((p) % N) #define RELAX(p1, p2, c) do { const int p = ENCODE((p1), (p2)); if ((c) < cost[p]) q.push(PII(cost[p] = (c), p)); } while (0) priority_queue > q; VI cost(N*N, INF); VB searched(N*N, false); RELAX(0, 0, 1); while (!q.empty()) { const PII p = q.top(); q.pop(); const int cost_u = p.first, u = p.second, u1 = DECODE1(u), u2 = DECODE2(u); if (searched[u]) continue; if (u1 == 1 && u2 == 1) return cost_u; REP (v, N) if (d[u1][v] != INF) RELAX(v, u2, cost_u + d[u1][v] + (v == u2 ? -1 : 0)); REP (v, N) if (d[v][u2] != INF) RELAX(u1, v, cost_u + d[v][u2] + (v == u1 ? -1 : 0)); if (u1 != u2 && d[u1][u2] != INF) RELAX(u2, u1, cost_u + d[u1][u2] - 1); searched[u] = true; } return -1; } int main() { for (int N, M, t = 1; scanf("%d%d", &N, &M), N || M; t++) { VVI d(N, VI(N, INF)); REP (i, N) d[i][i] = 0; REP (i, M) { int u, v; scanf("%d%d", &u, &v); u--, v--; d[u][v] = 1; } int answer = solve(d); printf("Network %d\n", t); if (answer == -1) printf("IMPOSSIBLE"); else printf("Minimum number of nodes = %d", answer); printf("\n\n"); } return 0; }