#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1600;
int W, H;
char img[MAX_N][MAX_N];
char buf[MAX_N][MAX_N];
char tmp[MAX_N][MAX_N];
int dist[MAX_N][MAX_N];
const char BACKGROUND = 0;
const char SUN = 1;
vector<int> v;
void dfs(int i, int j, int id) {
  if (buf[i][j] == 1) {
    buf[i][j] = id;
    v.push_back(i * 10000 + j);
    for (int di = -1; di <= 1; di++)
      for (int dj = -1; dj <= 1; dj++) {
        if (di == 0 && dj == 0) continue;
        dfs(i + di, j + dj, id);
      }
  }
}
int main() {
  scanf("%d%d", &H, &W);
  int x;
  for (int i = 0; i < (int)H; ++i)
    for (int j = 0; j < (int)W; ++j) {
      scanf("%d", &x);
      img[i][j] = x;
    }
  for (int i = 0; i < (int)H; ++i)
    for (int j = 0; j < (int)W; ++j) buf[i][j] = img[i][j];
  for (int step = 0; step < (int)1; ++step) {
    for (int i = 0; i < (int)H; ++i)
      for (int j = 0; j < (int)W; ++j) tmp[i][j] = img[i][j];
    for (int i = 1; i < H - 1; i++)
      for (int j = 1; j < W - 1; j++) {
        if (img[i][j] == 0) {
          tmp[i + 1][j + 1] = 0;
          tmp[i + 1][j] = 0;
          tmp[i + 1][j - 1] = 0;
          tmp[i][j + 1] = 0;
          tmp[i][j - 1] = 0;
          tmp[i - 1][j + 1] = 0;
          tmp[i - 1][j] = 0;
          tmp[i - 1][j - 1] = 0;
        }
      }
    for (int i = 0; i < (int)H; ++i)
      for (int j = 0; j < (int)W; ++j) img[i][j] = tmp[i][j];
  }
  for (int step = 0; step < (int)1; ++step) {
    for (int i = 0; i < (int)H; ++i)
      for (int j = 0; j < (int)W; ++j) tmp[i][j] = buf[i][j];
    for (int i = 1; i < H - 1; i++)
      for (int j = 1; j < W - 1; j++) {
        if (buf[i][j] == 0) {
          tmp[i + 1][j + 1] = 0;
          tmp[i + 1][j] = 0;
          tmp[i + 1][j - 1] = 0;
          tmp[i][j + 1] = 0;
          tmp[i][j - 1] = 0;
          tmp[i - 1][j + 1] = 0;
          tmp[i - 1][j] = 0;
          tmp[i - 1][j - 1] = 0;
        }
      }
    for (int i = 0; i < (int)H; ++i)
      for (int j = 0; j < (int)W; ++j) buf[i][j] = tmp[i][j];
  }
  for (int i = 0; i < (int)H; ++i) {
    for (int j = 0; j < (int)W; ++j) cerr << (buf[i][j] == 0 ? "." : "#");
    cerr << endl;
  }
  int id = 8;
  vector<int> ans;
  for (int i = 0; i < (int)H; ++i)
    for (int j = 0; j < (int)W; ++j) {
      if (buf[i][j] == 1) {
        v.clear();
        ++id;
        dfs(i, j, id);
        deque<int> deque;
        for (int k = 0; k < (int)v.size(); k++) {
          int r = v[k] / 10000;
          int c = v[k] % 10000;
          int oc = 0;
          for (int di = -1; di <= 1; di++)
            for (int dj = -1; dj <= 1; dj++) {
              if (di == 0 && dj == 0) continue;
              if (buf[r + di][c + dj] == id) oc++;
            }
          if (oc >= 8) {
            dist[r][c] = 0;
            deque.push_back(v[k]);
          } else {
            dist[r][c] = -1;
          }
        }
        vector<int> rs, cs;
        while (deque.size() > 0) {
          int pos = deque.front();
          deque.pop_front();
          int r = pos / 10000;
          int c = pos % 10000;
          if (dist[r][c] >= 6) {
            rs.push_back(r);
            cs.push_back(c);
            continue;
          }
          for (int di = -1; di <= 1; di++) {
            for (int dj = -1; dj <= 1; dj++) {
              if (di == 0 && dj == 0) continue;
              int dr = r + di;
              int dc = c + dj;
              if (buf[dr][dc] == id) {
                if (dist[dr][dc] == -1) {
                  deque.push_back(dr * 10000 + dc);
                  dist[dr][dc] = dist[r][c] + 1;
                  if (dist[r][c] >= 4) goto BK;
                }
              }
            }
          }
        BK:;
        }
        int m = rs.size();
        vector<int> ids(m);
        for (int i = 0; i < m; i++) ids[i] = i;
        for (int i = 0; i < m; i++) {
          for (int j = i + 1; j < m; j++) {
            if (abs(rs[i] - rs[j]) + abs(cs[i] - cs[j]) <= 1) {
              int a = ids[i];
              int b = ids[j];
              for (int k = 0; k < (int)m; ++k) {
                if (ids[k] == b) ids[k] = a;
              }
            }
          }
        }
        set<int> s;
        for (int i = 0; i < (int)m; ++i) s.insert(ids[i]);
        ans.push_back(s.size());
      }
    }
  sort(ans.begin(), ans.end());
  cout << ans.size() << endl;
  for (int i = 0; i < (int)ans.size(); i++) {
    if (i > 0) cout << " ";
    cout << ans[i];
  }
  cout << endl;
}
