#include <bits/stdc++.h>
using namespace std;
const int a1[4] = {1, -1, 0, 0}, a2[4] = {0, 0, 1, -1};
struct ww {
  int a, b;
} g[1610 * 1610], h[1610 * 1610];
int i, j, k, n, m, s, l, r;
int a[1610][1610], f[1610][1610], d[1610][1610], F[1610][1610],
    ans[1610 * 1610];
inline void bfs(int x, int y) {
  int i;
  g[l = r = 1].a = x, g[1].b = y;
  f[x][y] = 1;
  for (; l <= r; l++) {
    int X = g[l].a, Y = g[l].b;
    for (i = 0; i <= 3; i++) {
      int A = X + a1[i], B = Y + a2[i];
      if (a[A][B] && !f[A][B]) {
        f[A][B] = 1;
        g[++r].a = A, g[r].b = B;
      }
    }
  }
}
inline int cal(int x, int y) {
  int l, r, i;
  h[l = r = 1].a = x, h[1].b = y, d[x][y] = 0, F[x][y] = 1;
  for (; l <= r; l++) {
    int X = h[l].a, Y = h[l].b;
    if (d[X][Y] == d[h[r].a][h[r].b] && l <= r - 4) break;
    for (i = 0; i <= 3; i++) {
      int A = X + a1[i], B = Y + a2[i];
      if (a[A][B] && !F[A][B]) {
        F[A][B] = 1;
        h[++r].a = A, h[r].b = B;
        d[A][B] = d[X][Y] + 1;
      }
    }
  }
  int D = d[h[r].a][h[r].b];
  if (D <= 10)
    for (i = 1; i <= r; i++) F[h[i].a][h[i].b] = 0;
  return D > 10;
}
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] && !f[i][j]) {
        bfs(i, j);
        s = cal(i, j);
        for (k = r; k > 1; k--) {
          int A = g[k].a, B = g[k].b;
          if (!F[A][B]) s += cal(A, B);
        }
        ans[++*ans] = s;
      }
  sort(ans + 1, ans + *ans + 1);
  printf("%d\n", *ans);
  for (i = 1; i <= *ans; i++) printf("%d ", ans[i]);
  printf("\n");
  return 0;
}
