import sys def parse_input(): T = int(input()) for t in range(1, T + 1): R, C = map(int, input().split()) grid = [list(input().strip()) for _ in range(R)] yield t, grid def get_neighbors(grid, r, c): neighbors = [] for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]: nr, nc = r + dr, c + dc if 0 <= nr < len(grid) and 0 <= nc < len(grid[0]) and grid[nr][nc] != "#": neighbors.append((nr, nc)) return neighbors def dfs(grid, starts, finishes): drivable_pairs = [] visited = {} def dfs_helper(start, finish, prob): if start == finish: if prob >= 1 - 10**(-100): drivable_pairs.append((start, finish)) return if (start, finish) in visited and visited[(start, finish)] >= prob: return visited[(start, finish)] = prob for neighbor in get_neighbors(grid, *start): p = 1/2 if neighbor == finish else 1/4 if p >= 10**(-100): dfs_helper(neighbor, finish, prob * p) for start, finish in zip(starts, finishes): dfs_helper(start, finish, 1) return sorted(drivable_pairs) def solve_case(t, grid): starts = [] finishes = [] for r in range(len(grid)): for c in range(len(grid[0])): if grid[r][c].islower(): starts.append((r, c)) elif grid[r][c].isupper(): finishes.append((r, c)) drivable_pairs = dfs(grid, starts, finishes) if not drivable_pairs: print("Case #{}: NONE".format(t)) else: print("Case #{}: {}".format(t, " ".join(["".join(pair) for pair in drivable_pairs]))) def main(): for t, case in parse_input(): solve_case(t, case) if __name__ == "__main__": main()