### BUGGY CODE ###

# -*- coding: utf-8 -*-
#
import math
import sys
import itertools
import numpy as np

h,w = map(int, input().split())

ch,cw = map(int, input().split())
dh,dw = map(int, input().split())

x = np.zeros((h,w))
#y = np.zeros((h,w))

z = [list(input()) for i in range(h)]
for i in range(h):
    for j in range(w):
        if z[i][j]== '.':
            x[i][j] = 0
        else:
            x[i][j] = -1
#print(x)
x[ch-1][cw-1]=1

def tansaku():
    nu = 0
    while 1:
        nutta=0 # 塗ったマス
        for i in range(h):
            for j in range(w):
                if x[i][j] == 1:
                    if i>0:
                        if x[i-1][j]==0:
                            nutta += 1
                            x[i-1][j]=1
                    if j>0:
                        if x[i][j-1]==0:
                            nutta += 1
                            x[i][j-1]=1
                    if i<h-1:
                        if x[i+1][j]==0:
                            nutta += 1
                            x[i+1][j]=1
                    if j<w-1:
                        if x[i][j+1]==0:
                            nutta += 1
                            x[i][j+1]=1
        if nutta==0:
            return nu
        else:
            nu += nutta

def warp():
    y = np.zeros((h,w))
    nu = 0
    for i in range(h):
        for j in range(w):
            if x[i][j] == 1:
                for p in range(max(i-2,0),min(i+3,h)):
                    for q in range(max(j-2,0),min(j+3,w)):
                        if x[p][q] == 0:
                            y[p][q]=1
                            #print("a",p,q)
                            nu += 1
    for i in range(h):
        for j in range(w):
            if y[i][j]==1:
                x[i][j]=1
                #print("b")
    return nu # これは塗った数よりは多いがnuが1なら0ではない


answer = 0
while(1):
    #print(x,ch,cw,dh,dw)
    nurioe = tansaku()
    #print(x,nurioe)
    if x[dh-1][dw-1]==1:
        print(answer)
        break
    nurioe = warp()
    answer += 1
    #print(x,nurioe)
    if nurioe == 0:
        print(-1)
        break
    


### FIXED CODE ###

# -*- coding: utf-8 -*-
#
import math
import sys

from collections import deque

h,w = map(int, input().split())

ch,cw = map(int, input().split())
dh,dw = map(int, input().split())

maze =["#"*(w+4) for i in range(2)] + ["##"+input()+"##" for i in range(h)] + ["#"*(w+4) for i in range(2)]
temp = [[-1]*(w+4) for i in range(h+4)]

#print(maze)

q = deque([(ch+1,cw+1)])
temp[ch+1][cw+1]=0

opt = [(0,1),(0,-1),(1,0),(-1,0)]

while q:
    y,x = q.popleft()
#    print(y,x)
    # aruki
    for i in opt:
        ty,tx = y+i[0], x+i[1]
        if maze[ty][tx]=='#':
            continue
        if (temp[ty][tx] == -1 or temp[ty][tx] > temp[y][x]):
            temp[ty][tx] = temp[y][x] # ikeru
            q.appendleft((ty,tx)) # new ikeru basho tuika
    # warp
    for i in range(-2,3):
        for j in range(-2,3):
            ty,tx = y+i, x+j
            if maze[ty][tx] == "#":
                continue
            if temp[ty][tx] == -1 or temp[ty][tx] > temp[y][x]+1:
                temp[ty][tx] =  temp[y][x]+1
                q.append((ty,tx))  # 
#    print(q)


print(temp[dh+1][dw+1])