import sys from collections import deque def solve(): input_data = sys.stdin.read().split() if not input_data: return H = int(input_data[0]) W = int(input_data[1]) grid = input_data[2:] HW = H * W HW2 = 2 * HW HW3 = 3 * HW dist = [-1] * (4 * HW) start_state = 0 end_state = HW - 1 q = deque([start_state]) dist[start_state] = 0 is_empty = [False] * HW for r in range(H): row_str = grid[r] base = r * W for c in range(W): if row_str[c] != '#': is_empty[base + c] = True q_popleft = q.popleft q_append = q.append while q: curr = q_popleft() if curr == end_state: print(dist[curr]) return d = dist[curr] nd = d + 1 typ = curr // HW rem = curr % HW r = rem // W c = rem % W if typ == 0: if r > 0: nxt = rem - W if is_empty[nxt] and dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r < H - 1: nxt = rem + W if is_empty[nxt] and dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c > 0: nxt = rem - 1 if is_empty[nxt] and dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c < W - 1: nxt = rem + 1 if is_empty[nxt] and dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r < H - 1: nxt = HW + rem if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r > 0: nxt = HW + rem - W if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c < W - 1: nxt = HW2 + rem if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c > 0: nxt = HW2 + rem - 1 if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) elif typ == 1: if is_empty[rem] and dist[rem] == -1: dist[rem] = nd q_append(rem) nxt = rem + W if is_empty[nxt] and dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c > 0: nxt = curr - 1 if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c < W - 1: nxt = curr + 1 if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c < W - 1: nxt = HW3 + rem if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if c > 0: nxt = HW3 + rem - 1 if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) elif typ == 2: if is_empty[rem] and dist[rem] == -1: dist[rem] = nd q_append(rem) nxt = rem + 1 if is_empty[nxt] and dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r > 0: nxt = curr - W if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r < H - 1: nxt = curr + W if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r < H - 1: nxt = HW3 + rem if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) if r > 0: nxt = HW3 + rem - W if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) else: nxt = HW + rem if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) nxt = HW + rem + 1 if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) nxt = HW2 + rem if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) nxt = HW2 + rem + W if dist[nxt] == -1: dist[nxt] = nd q_append(nxt) print(-1) if __name__ == '__main__': solve()