#include <bits/stdc++.h>
using namespace std;
int n, m;
int in[1610][1610];
int vis[1610][1610];
vector<pair<int, int> > all;
int dx[8] = {1, 1, 1, 0, -1, -1, -1, 0}, dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
int que[1610 * 1610][2], qs, qe;
int dis[1610][1610];
inline void bfs(int visid) {
  while (qs < qe) {
    int x = que[qs][0], y = que[qs][1];
    qs++;
    for (int k = 0; k < (8); k++) {
      int xx = x + dx[k], yy = y + dy[k];
      if (xx < 0 || xx >= n || yy < 0 || yy >= m || !in[xx][yy] ||
          vis[xx][yy] == visid + 1)
        continue;
      dis[xx][yy] = dis[x][y] + 1;
      que[qe][0] = xx;
      que[qe][1] = yy;
      vis[xx][yy] = visid + 1;
      qe++;
    }
  }
}
vector<int> ans;
inline void output() {
  for (int i = 0; i < (n); i++) {
    for (int j = 0; j < (m); j++) printf("%d ", in[i][j]);
    puts("");
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++) scanf("%d", &in[i][j]);
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++)
      if (in[i][j] && !vis[i][j]) {
        all.clear();
        qs = qe = 0;
        que[qe][0] = i;
        que[qe][1] = j;
        vis[i][j] = 1;
        qe++;
        bfs(0);
        for (int k = 0; k < (qe); k++)
          all.push_back(make_pair(que[k][0], que[k][1]));
        qs = qe = 0;
        for (int k = 0; k < (((int)(all).size())); k++) {
          int x = all[k].first, y = all[k].second;
          for (int s = 0; s < (8); s++) {
            int xx = x + dx[s], yy = y + dy[s];
            if (xx < 0 || xx >= n || yy < 0 || yy >= m || in[xx][yy] == 0) {
              que[qe][0] = x;
              que[qe][1] = y;
              vis[x][y] = 2;
              dis[x][y] = 1;
              qe++;
            }
          }
        }
        bfs(1);
        qs = qe = 0;
        for (int k = 0; k < (((int)(all).size())); k++) {
          int x = all[k].first, y = all[k].second;
          if (dis[x][y] > 4) {
            que[qe][0] = x;
            que[qe][1] = y;
            vis[x][y] = 3;
            dis[x][y] = 1;
            qe++;
          }
        }
        bfs(2);
        int visid = 10;
        int cnt = 0;
        for (int k = 0; k < (((int)(all).size())); k++) {
          int x = all[k].first, y = all[k].second;
          if (dis[x][y] <= 8) {
            in[x][y] = 0;
          }
        }
        for (int k = 0; k < (((int)(all).size())); k++) {
          int x = all[k].first, y = all[k].second;
          if (in[x][y] && vis[x][y] == 3) {
            qs = qe = 0;
            que[qe][0] = x;
            que[qe][1] = y;
            vis[x][y] = visid + 1;
            qe++;
            bfs(visid);
            visid++;
            cnt++;
          }
        }
        ans.push_back(cnt);
      }
  sort(ans.begin(), ans.end());
  printf("%d\n", ((int)(ans).size()));
  for (int i = 0; i < (((int)(ans).size())); i++)
    printf("%d%c", ans[i], ((i == ((int)(ans).size()) - 1) ? '\n' : ' '));
}
