from collections import deque h, w, m = map(int, input().split()) mp = [list(input().strip()) for _ in range(h)] sx, sy = 0, 0 for i in range(h): for j in range(w): if mp[i][j] == 'S': sx, sy = i, j mp[i][j] = '.' # 現在、i,jにいるかつ鍵kを持っているときの最短距離. dist = [[[float("inf")]*(m+1) for _ in range(w)] for _ in range(h)] que = deque() dist[sx][sy][0] = 0 que.append((sx, sy, 0)) dx = [1, -1, 0, 0] dy = [0, 0, 1, -1] nums = set([str(i) for i in range(1, m+1)]) alps = set(chr(i) for i in range(ord('a'), ord('a') + m)) while que: x, y, k = que.popleft() for i in range(4): nx, ny = x + dx[i], y + dy[i] if not (0 <= nx < h and 0 <= ny < w): continue if mp[nx][ny] == '#': continue if mp[nx][ny] == 'G': print(dist[x][y][k] + 1) exit() if mp[nx][ny] == '.': if dist[nx][ny][k] > dist[x][y][k] + 1: dist[nx][ny][k] = dist[x][y][k] + 1 que.append((nx, ny, k)) elif mp[nx][ny] in nums: nk = int(mp[nx][ny]) if dist[nx][ny][nk] > dist[x][y][k] + 1: dist[nx][ny][nk] = dist[x][y][k] + 1 que.append((nx, ny, nk)) elif mp[nx][ny] in alps: if k == ord(mp[nx][ny]) - ord("a")+1: if dist[nx][ny][k] > dist[x][y][k] + 1: dist[nx][ny][k] = dist[x][y][k] + 1 que.append((nx, ny, k)) print(-1)