#include <bits/stdc++.h>
using namespace std;
long long mul(long long a, long long b) { return (a * b) % (100000007); }
long long add(long long a, long long b) { return (a + b) % (100000007); }
long long sub(long long a, long long b) {
  return (a - b + (a - b) / (100000007) * (100000007) + (100000007)) %
         (100000007);
}
int n, m;
int a[(1600 + 10)][(1600 + 10)] = {0}, b[(1600 + 10)][(1600 + 10)] = {0},
                           c[(1600 + 10)][(1600 + 10)] = {0};
void oper1() {
  memset(b, 0, sizeof(b));
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (!(a[i + 1][j] && a[i - 1][j] && a[i][j + 1] && a[i][j - 1]) &&
          a[i][j])
        b[i][j] = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (b[i][j]) a[i][j] = 0;
}
void oper2() {
  memset(b, 0, sizeof(b));
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if ((a[i + 1][j] || a[i - 1][j] || a[i][j + 1] || a[i][j - 1]) &&
          !a[i][j])
        b[i][j] = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (b[i][j]) a[i][j] = 1;
}
void pri() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) cout << b[i][j] << ' ';
    cout << endl;
  }
}
int totblock, ans[(1600 + 10) * (1600 + 10)] = {0}, size = 0;
void floodray(int x, int y) {
  b[x][y] = 0;
  totblock++;
  if (b[x + 1][y]) floodray(x + 1, y);
  if (b[x - 1][y]) floodray(x - 1, y);
  if (b[x][y + 1]) floodray(x, y + 1);
  if (b[x][y - 1]) floodray(x, y - 1);
}
void floodfill(int x, int y) {
  if (b[x][y]) totblock = 0, floodray(x, y), ans[size] += totblock > 6;
  c[x][y] = 0;
  if (c[x + 1][y]) floodfill(x + 1, y);
  if (c[x - 1][y]) floodfill(x - 1, y);
  if (c[x][y + 1]) floodfill(x, y + 1);
  if (c[x][y - 1]) floodfill(x, y - 1);
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cin >> a[i][j];
  memcpy(c, a, sizeof(c));
  for (int i = 1; i <= 4; i++) oper1();
  for (int j = 1; j <= 5; j++) oper2();
  memset(b, 0, sizeof(b));
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) b[i][j] = (a[i][j] == 0 && c[i][j] == 1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (c[i][j]) {
        size++;
        floodfill(i, j);
      }
  sort(ans + 1, ans + 1 + size);
  cout << size << endl;
  for (int i = 1; i <= size - 1; i++) cout << ans[i] << ' ';
  cout << ans[size] << endl;
  return 0;
}
