#include <bits/stdc++.h>
using namespace std;
int n, m, cnt, ray, area = 0;
int a[1700][1700], res[100000];
bool v[1700][1700], u[1700][1700];
int lx[1700 * 1700], ly[1700 * 1700];
double tot_x, tot_y, total;
int cx, cy, A;
double Weight(int x, int y) {
  int ok = 1;
  double res = 0;
  for (int dx = (-3); dx <= (3); dx++)
    for (int dy = (-3); dy <= (3); dy++) {
      int ti = x + dx, tj = y + dy;
      if (ti < 1 || tj < 1 || ti >= n || tj >= m) ok = 0;
      if (a[ti][tj] == 0) ok = 0;
    }
  if (ok) res += 0.3;
  ok = 1;
  for (int dx = (-5); dx <= (5); dx++)
    for (int dy = (-5); dy <= (5); dy++) {
      int ti = x + dx, tj = y + dy;
      if (ti < 1 || tj < 1 || ti >= n || tj >= m) ok = 0;
      if (a[ti][tj] == 0) ok = 0;
    }
  if (ok) res += 0.7;
  return res;
}
void dfs(int x, int y) {
  v[x][y] = 1;
  lx[area] = x, ly[area] = y;
  double w = Weight(x, y);
  tot_x += x * w;
  tot_y += y * w;
  total += w;
  if (w > 0.1) ++A;
  ++area;
  for (int i = (-1); i < (2); i++)
    for (int j = (-1); j < (2); j++) {
      int ti = x + i, tj = y + j;
      if (a[ti][tj] == 1 && !v[ti][tj]) dfs(ti, tj);
    }
}
void dfs2(int x, int y) {
  u[x][y] = 1;
  for (int i = (-1); i < (2); i++)
    for (int j = (-1); j < (2); j++) {
      int ti = x + i, tj = y + j;
      if (a[ti][tj] == 1 && !u[ti][tj]) dfs2(ti, tj);
    }
}
double dist(int x, int y, int a, int b) {
  return sqrt((x - a) * (x - a) + (y - b) * (y - b) + 0.0);
}
int main() {
  scanf("%d%d", &n, &m), ++n, ++m;
  for (int i = (1); i < (n); i++)
    for (int j = (1); j < (m); j++) scanf("%d", &a[i][j]);
  for (int i = (0); i < (n); i++)
    for (int j = (0); j < (m); j++)
      if (a[i][j] == 1 && !v[i][j]) {
        area = 0;
        tot_x = tot_y = 0;
        total = 0;
        A = 0;
        dfs(i, j);
        cx = (int)(tot_x / total);
        cy = (int)(tot_y / total);
        double r = round(sqrt(A * 1. / acos(-1.0))) + 8.0;
        for (int k = (0); k < (area); k++)
          if (dist(lx[k], ly[k], cx, cy) <= r) a[lx[k]][ly[k]] = 2;
        int ray = 0;
        for (int k = (0); k < (area); k++) {
          int x, y;
          x = lx[k], y = ly[k];
          if (a[x][y] == 1 && !u[x][y]) {
            dfs2(x, y);
            ++ray;
          }
        }
        res[cnt] = ray;
        ++cnt;
      }
  printf("%d\n", cnt);
  sort(res, res + cnt);
  for (int i = (0); i < (cnt); i++) printf("%d ", res[i]);
  return 0;
}
