from collections import deque

def bfs(maps, start) :
    sum = 0
    move = [(-1,0),(1,0),(0,1),(0,-1)]
    queue = deque([start])
    visited[start[0]][start[1]] = True
    while queue :
        vy, vx = queue.popleft()
        sum += int(maps[vy][vx])
        for i in move :
            y, x = vy + i[0], vx + i[1]
            if  y >= 0 and x >= 0 and y < max_y and x < max_x :
                if maps[y][x] != 'X' and visited[y][x] == False :
                    visited[y][x] = True
                    queue.append((y,x))
    return sum

def solution(maps):
    global visited, max_y, max_x
    max_y, max_x = len(maps), len(maps[0])
    visited = [[False] * len(i) for i in maps]
    maps = list(map(lambda x:list(x), maps))
    answer = []
    for i in range(max_y) :
        for j in range(max_x) :
            if visited[i][j] == False and maps[i][j] != 'X' :
                answer.append(bfs(maps, (i,j)))
    if answer : answer.sort()
    else : answer = [-1]
    return answer