#include <bits/stdc++.h>
using namespace std;
inline void R(int &x) {
  char ch = getchar();
  x = 0;
  for (; ch < '0'; ch = getchar())
    ;
  for (; ch >= '0'; ch = getchar()) x = x * 10 + ch - '0';
}
const int N = 1700, dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
int a[N][N], s[N][N], c[N][N];
bool v[N][N];
int n, m, cnt = 0, ans[N];
inline int sum(int x, int y) {
  return s[x + 4][y + 4] - s[x - 5][y + 4] - s[x + 4][y - 5] + s[x - 5][y - 5];
}
void dfs(int x, int y) {
  int tx, ty;
  v[x][y] = 1;
  for (int i = 0; i < 4; ++i) {
    tx = x + dx[i], ty = y + dy[i];
    if (!v[tx][ty] && (a[tx][ty] && sum(tx, ty) <= 25)) dfs(tx, ty);
  }
}
void dfs2(int x, int y) {
  int tx, ty;
  c[x][y] = cnt;
  for (int i = 0; i < 4; ++i) {
    tx = x + dx[i], ty = y + dy[i];
    if (!c[tx][ty] && a[tx][ty]) dfs2(tx, ty);
  }
}
int main() {
  R(n);
  R(m);
  for (int i = 10; i <= n + 9; ++i)
    for (int j = 10; j <= m + 9; ++j) R(a[i][j]);
  n += 20, m += 20;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      if (!c[i][j] && a[i][j]) ++cnt, dfs2(i, j);
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
      if (!v[i][j] && (a[i][j] && sum(i, j) <= 25)) dfs(i, j), ++ans[c[i][j]];
  sort(ans + 1, ans + cnt + 1);
  printf("%d\n", cnt);
  for (int i = 1; i <= cnt; ++i) printf("%d ", ans[i]);
  return 0;
}
