from collections import deque import sys # 0: 数据包可以在相邻的标准通道节点之间自由移动,每次移动消耗 1 个时间单位 # 1: 防火墙,不可通行 # 2: 量子纠缠门, 瞬间、不耗费任何时间直接传送到另一个纠缠门(DFS到所有其他纠缠门?) # S: 起点 # E: 终点 def main(): input = sys.stdin.readline m, n = list(map(int, input().split())) arr = [] # 获取起点和传送门 start_pos = (-1, -1) gates = [] for i in range(m): s = input().strip() tmp = [] for j in range(n): ch = s[j] if ch == 'S': start_pos = (i, j) elif ch == '2': gates.append([i, j]) # 记录所有传送门的位置 tmp.append(ch) arr.append(tmp) # 传送门成对出现 gates_pair = {} for k in range(0, len(gates), 2): x1, y1 = gates[k] x2, y2 = gates[k+1] gates_pair[(x1, y1)] = (x2, y2) gates_pair[(x2, y2)] = (x1, y1) # BFS遍历 visited = set() q = deque() q.append((start_pos, 0)) visited.add(start_pos) # 上右下左 dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]] while q: pos, time = q.popleft() x, y = pos # 遍历四个方向 for d in dirs: dx, dy = d nx, ny = x + dx, y + dy if (nx < 0 or nx >= m or ny < 0 or ny >= n or arr[nx][ny] == '1' or (nx, ny) in visited): continue visited.add((nx, ny)) ch = arr[nx][ny] if ch == 'E': # 终端 return time + 1 if ch == '0': q.append(((nx, ny), time+1)) continue elif ch == '2': # 量子纠缠门成对, 瞬间传送到对应位置 new_pos = gates_pair[(nx, ny)] if new_pos in visited: continue visited.add(new_pos) q.append((new_pos, time+1)) return -1 print(main())