#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010;
int n, m;
int a[maxn][maxn];
bool was[maxn][maxn], used[maxn][maxn];
int dx[] = {1, 1, -1, -1, 1, -1, 0, 0};
int dy[] = {-1, 1, -1, 1, 0, 0, 1, -1};
vector<vector<pair<int, int> > > cmps;
inline void dfs(int x, int y) {
  was[x][y] = 1;
  cmps.back().push_back(make_pair(x, y));
  for (int it = 0; it < 8; it++) {
    int nx = x + dx[it];
    int ny = y + dy[it];
    if (nx >= 0 && nx < n && ny >= 0 && ny < m && !was[nx][ny] &&
        a[nx][ny] == 1)
      dfs(nx, ny);
  }
}
int main() {
  scanf("%d%d\n", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) scanf("%d", &a[i][j]);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (!was[i][j] && a[i][j] == 1)
        cmps.push_back(vector<pair<int, int> >()), dfs(i, j);
  printf("%d\n", (int)cmps.size());
  vector<int> ans;
  for (int i = 0; i < (int)cmps.size(); i++) {
    int cnt = 0;
    for (int j = 0; j < (int)cmps[i].size(); j++) {
      int counter = 0;
      if (used[cmps[i][j].first][cmps[i][j].second]) continue;
      for (int x = cmps[i][j].first - 2; x <= cmps[i][j].first + 2; x++)
        for (int y = cmps[i][j].second - 2; y <= cmps[i][j].second + 2; y++)
          counter += (x >= 0 && x < n && y >= 0 && y < m && a[x][y]);
      if (counter == 9) {
        ++cnt;
        for (int x = cmps[i][j].first - 2; x <= cmps[i][j].first + 2; x++)
          for (int y = cmps[i][j].second - 2; y <= cmps[i][j].second + 2; y++)
            if (x >= 0 && x < n && y >= 0 && y < m) used[x][y] = 1;
      }
    }
    ans.push_back(cnt);
  }
  sort((ans).begin(), (ans).end());
  for (int i = 0; i < (int)ans.size(); i++)
    printf("%d%c", ans[i], " \n"[i == (int)ans.size() - 1]);
  return 0;
}
