from collections import defaultdict def is_valid(x, y, r, c): return x >= 0 and x < r and y >= 0 and y < c def dfs(grid, start, finish, visited, prob): if start == finish: return True visited[start] = True for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: x, y = start[0] + dx, start[1] + dy if is_valid(x, y, len(grid), len(grid[0])): if not visited[(x, y)] and grid[x][y] != "#": if grid[x][y] == "*": continue if grid[x][y].islower(): p = prob / 2 elif grid[x][y].isupper(): p = prob else: p = prob if dfs(grid, (x, y), finish, visited, p): return True return False def find_pairs(grid): starts = {} finishes = {} for i in range(len(grid)): for j in range(len(grid[0])): if grid[i][j].islower(): starts[grid[i][j]] = (i, j) elif grid[i][j].isupper(): finishes[grid[i][j]] = (i, j) graph = defaultdict(list) for start in starts.values(): visited = defaultdict(bool) for finish, pos in finishes.items(): if dfs(grid, start, pos, visited, 1): graph[chr(ord('a')+list(starts.keys()).index(grid[start[0]][start[1]]))].append(chr(ord('A')+list(finishes.keys()).index(grid[pos[0]][pos[1]]))) nodes = sorted(list(graph.keys())) pairs = [] for i in range(len(nodes)): for j in range(i+1, len(nodes)): visited = defaultdict(bool) if dfs(graph, nodes[i], nodes[j], visited, 1): pairs.append(nodes[i] + nodes[j]) return pairs t = int(input()) for case in range(1, t+1): r, c = map(int, input().split()) grid = [input().strip() for _ in range(r)] pairs = find_pairs(grid) if not pairs: print(f"Case #{case}: NONE") else: print(f"Case #{case}: {' '.join(pairs)}")