#include <bits/stdc++.h>
using namespace std;
template <class T>
void print(vector<T> v) {
  cerr << "[";
  if (v.size()) cerr << v[0];
  for (int i = (1); i < (v.size()); ++i) cerr << ", " << v[i];
  cerr << "]\n";
}
template <class T>
string i2s(T x) {
  ostringstream o;
  o << x;
  return o.str();
}
vector<string> splt(string s, char c = ' ') {
  vector<string> all;
  int p = 0, np;
  while (np = s.find(c, p), np >= 0) {
    if (np != p) all.push_back(s.substr(p, np - p));
    p = np + 1;
  }
  if (p < s.size()) all.push_back(s.substr(p));
  return all;
}
int h, w;
int data[1700][1700];
int edge[1700][1700];
int dr[] = {-1, 1, 0, 0, -1, -1, 1, 1};
int dc[] = {0, 0, -1, 1, -1, 1, -1, 1};
int main() {
  cin >> h >> w;
  for (int i = (0); i < (h); ++i)
    for (int j = (0); j < (w); ++j) scanf("%d", &data[i][j]);
  for (int r = (0); r < (h); ++r)
    for (int c = (0); c < (w); ++c)
      if (data[r][c]) {
        for (int d = (0); d < (4); ++d) {
          int nr = r + dr[d];
          int nc = c + dc[d];
          if (nr < 0 || nr >= h || nc < 0 || nc >= w || data[nr][nc] == 0)
            edge[r][c] = 1;
        }
      }
  vector<int> rays;
  for (int r = (0); r < (h); ++r)
    for (int c = (0); c < (w); ++c)
      if (edge[r][c]) {
        vector<pair<int, int> > v;
        int cr = r;
        int cc = c;
        while (edge[cr][cc]) {
          v.push_back(make_pair(cr, cc));
          edge[cr][cc] = 0;
          for (int d = (0); d < (8); ++d) {
            int nr = cr + dr[d];
            int nc = cc + dc[d];
            if (nr >= 0 && nr < h && nc >= 0 && nc < w && edge[nr][nc]) {
              cr = nr;
              cc = nc;
              break;
            }
          }
        }
        int bv = -1;
        int bp = -1;
        for (int i = (0); i < (v.size()); ++i)
          for (int j = (15); j < (110); ++j) {
            int sx = v[i].first;
            int sy = v[i].second;
            int ex = v[(i + j) % v.size()].first;
            int ey = v[(i + j) % v.size()].second;
            if (abs(sx - ex) > 35 || abs(sy - ey) > 35) break;
            if (abs(sx - ex) <= 5 && abs(sy - ey) <= 5 &&
                abs(sx - ex) + abs(sy - ey) <= 7) {
              if (j > bv) {
                bv = j;
                bp = i;
              }
            }
          }
        int count = 0;
        for (int i = (0); i < (v.size()); ++i)
          for (int j = (15); j < (110); ++j) {
            int sx = v[(i + bp) % v.size()].first;
            int sy = v[(i + bp) % v.size()].second;
            int ex = v[(i + j + bp) % v.size()].first;
            int ey = v[(i + j + bp) % v.size()].second;
            if (i + j > v.size()) break;
            if (abs(sx - ex) > 35 || abs(sy - ey) > 35) break;
            if (abs(sx - ex) <= 5 && abs(sy - ey) <= 5 &&
                abs(sx - ex) + abs(sy - ey) <= 7) {
              count++;
              i += j + 1;
              break;
            }
          }
        if (count) rays.push_back(count);
      }
  sort(rays.begin(), rays.end());
  cout << rays.size() << endl;
  for (int i = (0); i < (rays.size()); ++i) cout << rays[i] << ' ';
  cout << endl;
  return 0;
}
