#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:266777216")
using namespace std;
const int inf = 1000000000;
const long long INF = long long(inf) * inf;
const double eps = 1e-9;
const double PI = 2 * acos(0.0);
char a[1666][1666];
int n, m;
int mark[1666][1666];
int cmp;
void dfs(int i, int j) {
  if (i < 0 || j < 0 || i >= n || j >= m) return;
  if (!a[i][j] || mark[i][j]) return;
  mark[i][j] = cmp;
  dfs(i - 1, j);
  dfs(i + 1, j);
  dfs(i, j - 1);
  dfs(i, j + 1);
}
int res[1666 * 1666];
int vis[1666][1666];
int main() {
  while (scanf("%d%d", &n, &m) > 0) {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) scanf("%d", a[i] + j);
    cmp = 0;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++)
        if (a[i][j] && !mark[i][j]) {
          cmp++;
          dfs(i, j);
        }
    for (int i = 2; i < n - 2; i++)
      for (int j = 2; j < m - 2; j++)
        if (a[i][j] && !vis[i][j]) {
          int cnt = 0;
          for (int x = i - 2; x <= i + 2; x++)
            for (int y = j - 2; y <= j + 2; y++)
              if (a[x][y]) cnt++;
          if (cnt == 9) {
            res[mark[i][j]]++;
            for (int x = i - 2; x <= i + 2; x++)
              for (int y = j - 2; y <= j + 2; y++)
                if (a[x][y]) vis[x][y] = 1;
          }
        }
    sort(res + 1, res + 1 + cmp);
    printf("%d\n", cmp);
    for (int i = 1; i <= cmp; i++) printf("%d%c", res[i], i < cmp ? ' ' : '\n');
  }
  return 0;
}
