#include <bits/stdc++.h>
using namespace std;
const int N = 1700;
int g[N][N], n, m, ng[N][N], bg[N][N];
int c[4][2] = {1, 0, 0, 1, -1, 0, 0, -1},
    cc[8][2] = {1, 0, 0, 1, -1, 0, 0, -1, 1, 1, -1, -1, 1, -1, -1, 1};
void xiao() {
  int i, j, k;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      if (!g[i][j])
        ng[i][j] = 0;
      else {
        ng[i][j] = 1;
        for (k = 0; k < 4; k++) {
          int x = i + c[k][0], y = j + c[k][1];
          if (x > 0 && x <= n && y > 0 && y <= m) {
            if (!g[x][y]) ng[i][j] = 0;
          }
        }
      }
    }
  }
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) g[i][j] = ng[i][j];
}
int k;
void dfs(int x, int y) {
  bg[x][y] = k;
  for (int i = 0; i < 4; i++) {
    int a = x + c[i][0], b = y + c[i][1];
    if (a > 0 && a <= n && b > 0 && b <= m && g[a][b] && !bg[a][b]) {
      dfs(a, b);
    }
  }
}
bool u[N][N], vis[N][N];
void kuo() {
  int i, j, k;
  memset(ng, 0, sizeof(ng));
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++)
      if (g[i][j]) {
        ng[i][j] = 1;
        for (k = 0; k < 4; k++) {
          int x = i + c[k][0], y = j + c[k][1];
          if (x > 0 && x <= n && y > 0 && y <= m && bg[x][y] == bg[i][j]) {
            ng[x][y] = 1;
          }
        }
      }
  }
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) g[i][j] = ng[i][j];
}
int cnt[N * N];
void ddfs(int x, int y) {
  vis[x][y] = true;
  for (int i = 0; i < 8; i++) {
    int a = x + cc[i][0], b = y + cc[i][1];
    if (a > 0 && a <= n && b > 0 && b <= m && bg[a][b] == bg[x][y] &&
        !u[a][b] && !vis[a][b]) {
      ddfs(a, b);
    }
  }
}
int main() {
  int i, j;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      scanf("%d", &g[i][j]);
    }
  }
  xiao();
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++)
      if (g[i][j] && !bg[i][j]) {
        k++;
        dfs(i, j);
      }
  }
  xiao();
  xiao();
  kuo();
  kuo();
  kuo();
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++)
      if (g[i][j]) u[i][j] = true;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++)
      if (bg[i][j] && !u[i][j] && !vis[i][j]) {
        cnt[bg[i][j]]++;
        ddfs(i, j);
      }
  }
  printf("%d\n", k);
  sort(cnt + 1, cnt + k + 1);
  for (i = 1; i <= k; i++) printf("%d ", cnt[i]);
  return 0;
}
