package yukicoder; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int M = sc.nextInt(); int N = sc.nextInt(); int[][] a = new int[M][N]; for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { a[i][j] = sc.nextInt(); } } int[][] mx = new int[M * N][M * N]; int[] v = new int[M * N]; for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { v[i * N + j] = a[i][j]; } } for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { for (int dx = -1; dx <= 1; ++dx) { for (int dy = -1; dy <= 1; ++dy) { int nx = j + dx; int ny = i + dy; if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue; mx[i * N + j][ny * N + nx] = 1; } } } } for (int i = 0; i < M * N; ++i) { int j = i; while (j < M * N && mx[j][i] == 0) { ++j; } if (j == M * N) continue; if (i != j) { for (int k = 0; k < N * M; ++k) { int d = mx[i][k]; mx[i][k] = mx[j][k]; mx[j][k] = d; } int d = v[i]; v[i] = v[j]; v[j] = d; } for (int k = 0; k < M * N; ++k) { if (k == i) continue; if (mx[k][i] == 1) { for (int l = 0; l < M * N; ++l) { mx[k][l] = (mx[k][l] + mx[i][l]) % 2; } v[k] = (v[k] + v[i] + 2) % 2; } } } // show(mx, v, M, N); int c = 0; for (int i = N * M - 1; i >= 0; --i) { if (v[i] == 1) { if (mx[i][i] != 1) { System.out.println("Impossible"); return; } else { ++c; for (int k = 0; k <= i; ++k) { if (mx[k][i] == 1) { v[k] = v[k] ^ 1; } } } } } System.out.println(c); } static void show(int[][] mx, int[] v, int M, int N) { for (int i = 0; i < N * M; ++i) { if (i != 8 && i != 16) System.out.print(" "); else System.out.print("* "); } System.out.println(); for (int i = 0; i < M * N; ++i) { for (int j = 0; j < M * N; ++j) { System.out.print(mx[i][j] + " "); } System.out.print(v[i]); System.out.println(); } } static void tr(Object... objects) { System.out.println(Arrays.deepToString(objects)); } }