#include <bits/stdc++.h>
using namespace std;
int a[2050][2050];
int vis[2050][2050], c[2050][2050];
int flag, i, j, n, m, cnt, isp[2050 * 2050];
int len[2050 * 2050], G, f1;
int find(int x) {
  if (isp[x] != x) isp[x] = find(isp[x]);
  return isp[x];
}
int gcd(int x, int y) {
  if (!y) return x;
  return gcd(y, x % y);
}
int cx(int x, int y) {
  if (x < 1 || x > n || y < 1 || y > m) return 0;
  return a[x][y];
}
int cot(int x, int y) {
  return cx(x - 1, y) + cx(x + 1, y) + cx(x, y - 1) + cx(x, y + 1);
}
int iswl(int x, int y) {
  if (!c[x - 1][y] && a[x - 1][y]) return 1;
  if (!c[x + 1][y] && a[x + 1][y]) return 1;
  if (!c[x][y - 1] && a[x][y - 1]) return 1;
  if (!c[x][y + 1] && a[x][y + 1]) return 1;
  return 0;
}
int isturn(int x, int y) {
  int s = cot(x, y);
  if (s == 2) {
    if (cx(x - 1, y) + cx(x + 1, y) == 2) return 1;
    if (cx(x, y - 1) + cx(x, y + 1) == 2) return 1;
  }
  return 0;
}
void merge(int x, int y) {
  if (cx(x, y)) {
    int f2 = find((x - 1) * m + y);
    isp[f2] = f1;
  }
}
void dfs(int x, int y) {
  vis[x][y] = 1;
  len[cnt]++;
  if (c[x - 1][y] && !vis[x - 1][y]) dfs(x - 1, y);
  if (c[x + 1][y] && !vis[x + 1][y]) dfs(x + 1, y);
  if (c[x][y - 1] && !vis[x][y - 1]) dfs(x, y - 1);
  if (c[x][y + 1] && !vis[x][y + 1]) dfs(x, y + 1);
}
int main() {
  scanf("%d %d", &n, &m);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) scanf("%d", &a[i][j]);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (a[i][j]) flag += (cot(i, j) & 1);
  if (flag > 2) {
    printf("-1");
    return 0;
  }
  for (i = 1; i <= n * m; i++) isp[i] = i;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (a[i][j]) {
        f1 = find((i - 1) * m + j);
        merge(i - 1, j), merge(i + 1, j);
        merge(i, j - 1), merge(i, j + 1);
      }
  flag = 0;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (a[i][j] && isp[(i - 1) * m + j] == (i - 1) * m + j) flag++;
  if (flag > 1) {
    printf("-1");
    return 0;
  }
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (a[i][j]) c[i][j] = isturn(i, j);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (!c[i][j] && a[i][j])
        if (iswl(i, j)) {
          printf("-1");
          return 0;
        }
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (c[i][j] && !vis[i][j]) {
        cnt++;
        len[cnt] = 1;
        dfs(i, j);
      }
  if (!cnt) {
    printf("-1");
    return 0;
  }
  G = len[1];
  for (i = 2; i <= cnt; i++) G = gcd(G, len[i]);
  if (G == 1)
    printf("-1");
  else {
    for (i = 2; i <= G; i++)
      if (G % i == 0) printf("%d ", i);
  }
  return 0;
}
