import sys 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:] R = 2 * H - 1 C = 2 * W - 1 R_prime = R + 4 C_prime = C + 4 N_prime = R_prime * C_prime visited = bytearray(b'\x01' * N_prime) empty_row = b'\x00' * C for r in range(R): start_idx = (r + 2) * C_prime + 2 visited[start_idx : start_idx + C] = empty_row for r in range(H): row_str = grid[r] row_offset = (2 * r + 2) * C_prime for c in range(W): if row_str[c] == '#': visited[row_offset + 2 * c + 2] = 1 can_jump_h = bytearray(N_prime) can_jump_v = bytearray(N_prime) row_ones = b'\x01' * C for r in range(0, R, 2): start_idx = (r + 2) * C_prime + 2 can_jump_v[start_idx : start_idx + C] = row_ones for r in range(R): row_offset = (r + 2) * C_prime for c in range(0, C, 2): can_jump_h[row_offset + c + 2] = 1 start = 2 * C_prime + 2 target = (R - 1 + 2) * C_prime + (C - 1 + 2) if start == target: print(0) return q = [start] visited[start] = 1 step = 1 C_prime2 = 2 * C_prime while q: new_q = [] app = new_q.append for u in q: v = u - 1 if not visited[v]: visited[v] = 1; app(v) v = u + 1 if not visited[v]: visited[v] = 1; app(v) v = u - C_prime if not visited[v]: visited[v] = 1; app(v) v = u + C_prime if not visited[v]: visited[v] = 1; app(v) if can_jump_h[u]: v = u - 2 if not visited[v]: visited[v] = 1; app(v) v = u + 2 if not visited[v]: visited[v] = 1; app(v) if can_jump_v[u]: v = u - C_prime2 if not visited[v]: visited[v] = 1; app(v) v = u + C_prime2 if not visited[v]: visited[v] = 1; app(v) if visited[target]: print(step) return q = new_q step += 1 print(-1) if __name__ == '__main__': solve()