from collections import deque from itertools import product def bfs(start, finish, r, c, grid, probs): q = deque([start]) visited = set([start]) while q: curr = q.popleft() if curr == finish: return True for dx, dy, prob in [(0, 1, probs[0]), (0, -1, probs[1]), (1, 0, probs[2]), (-1, 0, probs[3])]: nx, ny = curr[0] + dx, curr[1] + dy if 0 <= nx < r and 0 <= ny < c and (nx, ny) not in visited and grid[nx][ny] != '#': visited.add((nx, ny)) if grid[nx][ny] != '*' and not bfs((nx, ny), finish, r, c, grid, probs): return False elif grid[nx][ny] == '*' and prob > 0: if not bfs((nx, ny), finish, r, c, grid, [prob / 2] * 4): return False return False def solve_case(case_num, r, c, grid): starts = {} finishes = {} for i, j in product(range(r), range(c)): if 'a' <= grid[i][j] <= 'z': starts[grid[i][j]] = (i, j) elif 'A' <= grid[i][j] <= 'Z': finishes[grid[i][j]] = (i, j) pairs = [] for s, f in product(starts, finishes): if bfs(starts[s], finishes[f], r, c, grid, [0.5] * 4): pairs.append(s + f) pairs.sort() if pairs: print("Case #{}: {}".format(case_num, " ".join(pairs))) else: print("Case #{}: NONE".format(case_num)) t = int(input()) for i in range(t): r, c = map(int, input().split()) grid = [input().strip() for _ in range(r)] solve_case(i+1, r, c, grid)