r, c = map(int, input().split())
sx, sy = map(int, input().split())
gx, gy = map(int, input().split())
sx -= 1
sy -= 1
gx -= 1
gy -= 1
maze = []
for i in range(r):
a = input()
maze.append(list(a))
def debug_print(maze):
for xx in maze:
for yy in xx:
print(yy, end=" ")
print("\n")
def clear_maze(sx, sy, gx, gy, maze):
#debug_print(maze)
INF = 1000000000
field_x_length = len(maze)
field_y_length = len(maze[0])
distance = [[INF for i in range(field_x_length)] for j in range(field_y_length)]
def bfs():
queue = []
queue.insert(0, (sx, sy))
distance[sx][sy] = 0
while len(queue):
x, y = queue.pop()
if x == gx and y == gy:
break
for i in range(0, 4):#4方向のループ 該当あれば移動後の点をnx, nyとする
nx, ny = x + [1, 0, -1, 0][i], y + [0, 1, 0, -1][i]
if (0 <= nx and nx < field_x_length and 0 <= ny and ny < field_y_length and distance[nx][ny] == INF and maze[nx][ny] != '#'):
queue.insert(0, (nx, ny))
distance[nx][ny] = distance[x][y] + 1
return distance[gx][gy]
return bfs()
print(clear_maze(sx, sy, gx, gy, maze))