#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2048;
const int dx[] = {0, 0, 1, -1, -1, -1, 1, 1};
const int dy[] = {1, -1, 0, 0, -1, 1, -1, 1};
int h, w;
bool ma3x[MAXN][MAXN];
bool a[MAXN][MAXN], b[MAXN][MAXN];
int num[MAXN][MAXN], color;
queue<pair<int, int> > q;
vector<int> vec;
void read() {
  scanf("%d %d", &h, &w);
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) scanf("%d", &ma3x[i][j]);
}
bool outside(int x, int y) { return (x < 0 || x >= h || y < 0 || y >= w); }
bool inside(int x, int y) { return !outside(x, y); }
void erose() {
  memcpy(b, a, sizeof(a));
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++)
      if (b[i][j]) {
        for (int k = 0; k < 8; k++) {
          int x = i + dx[k];
          int y = j + dy[k];
          if (outside(x, y) || !a[x][y]) {
            b[i][j] = false;
            break;
          }
        }
      }
  memcpy(a, b, sizeof(b));
}
void deviate() {
  memcpy(b, a, sizeof(a));
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++)
      if (!b[i][j]) {
        for (int k = 0; k < 8; k++) {
          int x = i + dx[k];
          int y = j + dy[k];
          if (inside(x, y) && a[x][y]) {
            b[i][j] = true;
            break;
          }
        }
      }
  memcpy(a, b, sizeof(b));
}
void bfs1(int x, int y) {
  q.push(make_pair(x, y));
  num[x][y] = color;
  while (!q.empty()) {
    pair<int, int> tmp = q.front();
    q.pop();
    for (int i = 0; i < 8; i++) {
      x = tmp.first + dx[i];
      y = tmp.second + dy[i];
      if (inside(x, y) && a[x][y] && num[x][y] == -1) {
        num[x][y] = color;
        q.push(make_pair(x, y));
      }
    }
  }
}
void bfs2(int x, int y) {
  q.push(make_pair(x, y));
  ma3x[x][y] = false;
  int sunNumber = -1;
  while (!q.empty()) {
    pair<int, int> tmp = q.front();
    q.pop();
    for (int i = 0; i < 8; i++) {
      x = tmp.first + dx[i];
      y = tmp.second + dy[i];
      if (inside(x, y)) {
        if (num[x][y] != -1)
          sunNumber = num[x][y];
        else if (ma3x[x][y]) {
          ma3x[x][y] = false;
          q.push(make_pair(x, y));
        }
      }
    }
  }
  if (sunNumber != -1) vec[sunNumber]++;
}
void solve() {
  memcpy(a, ma3x, sizeof(ma3x));
  for (int iter = 0; iter < 3; iter++) erose();
  for (int iter = 0; iter < 5; iter++) deviate();
  memset(num, -1, sizeof(num));
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++)
      if (a[i][j] && num[i][j] == -1) {
        bfs1(i, j);
        color++;
      }
  vec.resize(color);
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++)
      if (ma3x[i][j] && num[i][j] == -1) bfs2(i, j);
  sort(vec.begin(), vec.end());
  int cnt = 0;
  for (int i = 0; i < vec.size(); i++)
    if (vec[i] == 0)
      break;
    else
      cnt++;
  cout << cnt << endl;
  for (int i = 0; i < vec.size(); i++)
    if (vec[i] == 0)
      break;
    else {
      if (i) cout << " ";
      cout << vec[i];
    }
  cout << endl;
}
int main() {
  read();
  solve();
  return 0;
}
