#include <bits/stdc++.h>
using namespace std;
long n, m, arp[2000][2000], orig[2000][2000], cur[2000][2000], nw[2000][2000];
long ttl;
vector<long> ans;
long answ[200];
void dfs2(long a, long b) {
  if (arp[a][b]) return;
  arp[a][b] = 1;
  if (cur[a][b] == 1) return;
  if (orig[a][b] == 0) return;
  dfs2(a - 1, b);
  dfs2(a + 1, b);
  dfs2(a, b - 1);
  dfs2(a, b + 1);
  dfs2(a - 1, b - 1);
  dfs2(a + 1, b - 1);
  dfs2(a + 1, b + 1);
  dfs2(a - 1, b + 1);
}
long clr[2500][2500];
void dfs1(long a, long b, long cl) {
  clr[a][b] = cl;
  if (orig[a - 1][b] > 0 && clr[a - 1][b] == 0) dfs1(a - 1, b, cl);
  if (orig[a + 1][b] > 0 && clr[a + 1][b] == 0) dfs1(a + 1, b, cl);
  if (orig[a][b - 1] > 0 && clr[a][b - 1] == 0) dfs1(a, b - 1, cl);
  if (orig[a][b + 1] > 0 && clr[a][b + 1] == 0) dfs1(a, b + 1, cl);
}
long tcl;
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cin >> orig[i][j];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      if (orig[i][j] == 1)
        if (clr[i][j] == 0) {
          ++tcl;
          dfs1(i, j, tcl);
        }
    }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cur[i][j] = orig[i][j];
  for (int iter = 1; iter <= 9; iter++) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++)
        nw[i][j] = (cur[i][j] & cur[i - 1][j] & cur[i + 1][j] & cur[i][j - 1] &
                    cur[i][j + 1]);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) cur[i][j] = nw[i][j];
  }
  for (int iter = 1; iter <= 14; iter++) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++)
        nw[i][j] = (cur[i][j] | cur[i - 1][j] | cur[i + 1][j] | cur[i][j - 1] |
                    cur[i][j + 1]);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) cur[i][j] = nw[i][j];
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      if (arp[i][j]) continue;
      if (orig[i][j] == 1 && cur[i][j] == 0) {
        dfs2(i, j);
        ++answ[clr[i][j]];
      }
    }
  for (int i = 1; i <= tcl; i++) ans.push_back(answ[i]);
  sort(ans.begin(), ans.end());
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) {
    if (i) cout << " ";
    cout << ans[i];
  }
  cout << endl;
  cin.get();
  cin.get();
  return 0;
}
