import re
import sys

MAX_CELLS = 500

line = sys.stdin.readline()
assert re.match('^[1-9][0-9]* [1-9][0-9]*\n$', line)
(H, W) = map(int, line.split())

maze = []

special_pos = {}

for r in range(H):
    line = sys.stdin.readline()
    assert line[-1] == '\n'
    line = line[:-1]
    assert len(line) == W
    maze.append(line)
    for c in range(W):
        x = maze[r][c]
        assert x in '#.SAaBb'
        if x in 'SAaBb':
            assert x not in special_pos
            special_pos[x] = (r, c)

assert 'S' in special_pos
assert ('A' in special_pos) == ('a' in special_pos)
assert ('B' in special_pos) == ('b' in special_pos)

# Check for wall boundary
for i in range(H):
    assert maze[i][0] == '#'
    assert maze[i][W-1] == '#'
for i in range(W):
    assert maze[0][i] == '#'
    assert maze[H-1][i] == '#'

# Check for minimum size
assert any(maze[1][c] != '#' for c in range(W))
assert any(maze[H-2][c] != '#' for c in range(W))
assert any(maze[r][1] != '#' for r in range(H))
assert any(maze[r][W-2] != '#' for r in range(H))
    
def reach_all(start, traps):
    (sr, sc) = start
    Q = [(sr, sc)]
    seen = set(Q)
    while Q:
        (r, c) = Q.pop()
        for (nr, nc) in [(r+1, c), (r-1, c), (r, c+1), (r, c-1)]:
            if maze[nr][nc] == '#': continue
            if (nr, nc) in traps:
                seen.add((nr, nc))
                (nr, nc) = traps[(nr, nc)]
            if (nr, nc) not in seen:
                seen.add((nr, nc))
                Q.append((nr, nc))
    for r in range(H):
        for c in range(W):
            if maze[r][c] != '#' and (r, c) not in seen:
                return False

    assert len(seen) <= MAX_CELLS, len(seen)
    
    return True

traps = {}
if 'A' in special_pos:
    traps[special_pos['A']] = special_pos['a']
if 'B' in special_pos:
    traps[special_pos['B']] = special_pos['b']

# Reach everything from starting point?
assert reach_all(special_pos['S'], traps)

# Reach everything from endpoint of trap a?
if 'a' in special_pos:
    assert reach_all(special_pos['a'], traps)

# Reach everything from endpoint of trap b?
if 'b' in special_pos:
    assert reach_all(special_pos['b'], traps)

# Reach everything from starting point if traps are removed?
assert reach_all(special_pos['S'], {})


# no trailing junk
assert sys.stdin.readline() == ''

sys.exit(42)
