n=int(input())
visited=[[0]*n for _ in range(n)]
matrix=[] #입력받은 행렬
goal=[] #단지 수 집어넣을 곳
count=0
danji=0
for i in range(n):
matrix.append(list(map(int,str(input())))) #숫자가 붙어있는 경우 먼저 str로 변환
def recurse(j,k):
global n, count
if visited[j][k]!=0:
return
#print(j,k) 이거로 실행되는 행, 열 확인했음
count+=1
visited[j][k]=1
if k!=n-1:
if matrix[j][k+1]==1: #오른쪽
recurse(j,k+1)
if k!=0:
if matrix[j][k-1]==1: #왼쪽
recurse(j,k-1)
if j!=0:
if matrix[j-1][k]==1: #위
recurse(j-1,k)
if j!=n-1:
if matrix[j+1][k]==1: #아래
recurse(j+1,k)
for j in range(n):
for k in range(n):
if matrix[j][k]==1: #matrix에서 1인 부분 찾으면 ㄱ
recurse(j,k)
if count!=0:
goal.append(count)
danji+=1 #여기다가 하는 게 안전빵인데 더 생각 좀 해봐..
count=0
print(danji)
for i in sorted(goal):
print(i)