#include <bits/stdc++.h>
using namespace std;
const int N = 1705;
inline int IN() {
  char ch;
  (ch = getchar());
  int f = 0, x = 0;
  for (; ((ch) == '\n' || (ch) == '\r' || (ch) == '\t' || (ch) == ' ');
       (ch = getchar()))
    ;
  if (ch == '-') f = 1, (ch = getchar());
  for (; !((ch) == '\n' || (ch) == '\r' || (ch) == '\t' || (ch) == ' ');
       (ch = getchar()))
    x = x * 10 + ch - '0';
  return (f) ? (-x) : (x);
}
int s[N][N], a[N][N], n, m, id[N][N], tot, is[N][N], Ti, res[N * 5];
int work(int D, int R, int U, int L) {
  --U;
  --L;
  return s[D][R] + s[U][L] - s[U][R] - s[D][L];
}
bool Is(int x, int y) { return work(x + 3, y + 3, x - 3, y - 3) <= 15; }
void dfs(int x, int y) {
  if (!a[x][y] || id[x][y]) return;
  id[x][y] = tot;
  dfs(x - 1, y);
  dfs(x + 1, y);
  dfs(x, y - 1);
  dfs(x, y + 1);
}
int t[N];
void work(int x, int y) {
  if (!a[x][y] || is[x][y]) return;
  if (!Is(x, y)) {
    if (t[id[x][y]] != Ti) {
      t[id[x][y]] = Ti;
      res[id[x][y]]++;
    }
    return;
  }
  is[x][y] = 1;
  work(x - 1, y);
  work(x + 1, y);
  work(x, y - 1);
  work(x, y + 1);
}
int main() {
  scanf("%d%d", &n, &m);
  n += 5, m += 5;
  for (int i = (int)6; i <= (int)n; i++)
    for (int j = (int)6; j <= (int)m; j++) a[i][j] = IN();
  n += 5;
  m += 5;
  for (int i = (int)1; i <= (int)n; i++)
    for (int j = (int)1; j <= (int)m; j++)
      s[i][j] = a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
  for (int i = (int)1; i <= (int)n; i++)
    for (int j = (int)1; j <= (int)m; j++)
      if (a[i][j] && !id[i][j]) ++tot, dfs(i, j);
  for (int i = (int)1; i <= (int)n; i++)
    for (int j = (int)1; j <= (int)m; j++)
      if (a[i][j] && !is[i][j] && Is(i, j)) ++Ti, work(i, j);
  printf("%d\n", tot);
  sort(res + 1, res + tot + 1);
  for (int i = (int)1; i <= (int)tot; i++) printf("%d ", res[i]);
  return 0;
}
