import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



# ---------標準入力時--------------

h,w=list(map(int,readline().split()))

ch, cw=list(map(int,readline().split()))

dh, dw=list(map(int,readline().split()))

m=list([list(x.decode()) for x in readlines()])

# ---------標準入力時--------------



ud=[(-1,0), (1,0)] # 上下

lr=[(0,-1), (0,1)] # 左右

warp = [(-2, -2),(-2, -1),(-2, 0),(-2, 1),(-2, 2),

 (-1, -2),(-1, -1),(-1, 1),(-1, 2),

 (0, -2),(0, 2),

 (1, -2),(1, -1),(1, 1),(1, 2),

 (2, -2),(2, -1),(2, 0),(2, 1),(2, 2)]



def bfs5():

    '''

    bfs4から少し変更

    あるマス(i,j)から上(i-1,j)下(i+1,j) もしくは 左(i,j-1)右(i,j+1)に歩いて行ける時、

    (i,j)からwarpで行ける範囲は、その上下もしくは左右でカバーされるので、(i,jは考えなくていい)

    '''

    que1=[]

    que2=[] # queueというよりはメモリ

    m[ch][cw]=str(0)

    que1.append((ch,cw))



    while que1!=[]:

        l1=len(que1)

        r1=0 # que1における使用済みindex



        # que1の要素(座標)から歩いていけるマス

        while r1<l1:

            i, j=que1[r1]

            cnt_ud=0

            # 隣接した上下のマスへの移動

            for si, sj in ud:

                if m[i+si][j+sj]=='.': 

                    m[i+si][j+sj]=m[i][j]

                    que1.append((i+si, j+sj))

                    cnt_ud+=1

            cnt_lr=0

            # 隣接した上下のマスへの移動

            for si, sj in lr:

                if m[i+si][j+sj]=='.': 

                    m[i+si][j+sj]=m[i][j]

                    que1.append((i+si, j+sj))

                    cnt_lr+=1



            if cnt_ud==2 or cnt_lr==2: # que1[r1]は不要

                que1.pop(r1); l1+=cnt_ud+cnt_lr-1

            else: # que1[r1]は必要

                r1+=1; l1+=cnt_ud+cnt_lr



        # 歩いていけないマス

        for i,j in que1:

            for si, sj in warp:

                if m[i+si][j+sj]=='.':

                    m[i+si][j+sj]=str(int(m[i][j])+1)

                    que2.append((i+si, j+sj))



        que1=que2

        que2=[]

        

for i in range(h):

    m[i] = ['#']*2 + m[i] + ['#']*2

    

m = [['#']*(w+4)]*2 + m + [['#']*(w+4)]*2

ch+=1; cw+=1; dh+=1; dw+=1



bfs5() 

if m[dh][dw] == '.':

    print((-1))

else:

    print((m[dh][dw]))
import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



# ---------標準入力時--------------

h,w=list(map(int,readline().split()))

ch, cw=list(map(int,readline().split()))

dh, dw=list(map(int,readline().split()))

m=list([list(x.decode()) for x in readlines()])

# ---------標準入力時--------------



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

warp = [(-2, -2),(-2, -1),(-2, 0),(-2, 1),(-2, 2),

 (-1, -2),(-1, -1),(-1, 1),(-1, 2),

 (0, -2),(0, 2),

 (1, -2),(1, -1),(1, 1),(1, 2),

 (2, -2),(2, -1),(2, 0),(2, 1),(2, 2)]



def bfs6():

    '''

    bfs5から少し変更

    あるマス(i,j)から上(i-1,j)下(i+1,j) もしくは 左(i,j-1)右(i,j+1)に歩いて行ける時、

    (i,j)からwarpで行ける範囲は、その上下もしくは左右でカバーされるので、(i,jは考えなくていい)

    これをwarpを考えるときに処理する

    '''

    que1=[]

    que2=[] # queueというよりはメモリ

    m[ch][cw]=str(0)

    que1.append((ch,cw))



    while que1!=[]:

        l1=len(que1)

        r1=0 # que1における使用済みindex



        # que1の要素(座標)から歩いていけるマス

        while r1<l1:

            i, j=que1[r1]

            r1+=1

            for si, sj in ad:

                if m[i+si][j+sj]=='.': 

                    m[i+si][j+sj]=m[i][j]

                    que1.append((i+si, j+sj))

                    l1+=1



        # 歩いていけないマス

        for i,j in que1:

            if (m[i][j]==m[i-1][j] and m[i][j]==m[i+1][j]) or (m[i][j]==m[i][j-1] and m[i][j]==m[i][j+1]):

                continue

            for si, sj in warp:

                if m[i+si][j+sj]=='.':

                    m[i+si][j+sj]=str(int(m[i][j])+1)

                    que2.append((i+si, j+sj))



        que1=que2

        que2=[]

###---------------------------------------



for i in range(h):

    m[i] = ['#']*2 + m[i] + ['#']*2

    

m = [['#']*(w+4)]*2 + m + [['#']*(w+4)]*2

ch+=1; cw+=1; dh+=1; dw+=1



bfs6()



if m[dh][dw] == '.':

    print((-1))

else:

    print((m[dh][dw]))
import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
# ---------標準入力時--------------
h, w = list(map(int, readline().split()))
ch, cw = list(map(int, readline().split()))
dh, dw = list(map(int, readline().split()))
m = list([list(x.decode()) for x in readlines()])
# ---------標準入力時--------------
ud = [(-1, 0), (1, 0)]  # 上下
lr = [(0, -1), (0, 1)]  # 左右
warp = [
    (-2, -2),
    (-2, -1),
    (-2, 0),
    (-2, 1),
    (-2, 2),
    (-1, -2),
    (-1, -1),
    (-1, 1),
    (-1, 2),
    (0, -2),
    (0, 2),
    (1, -2),
    (1, -1),
    (1, 1),
    (1, 2),
    (2, -2),
    (2, -1),
    (2, 0),
    (2, 1),
    (2, 2),
]


def bfs5():
    """
    bfs4から少し変更
    あるマス(i,j)から上(i-1,j)下(i+1,j) もしくは 左(i,j-1)右(i,j+1)に歩いて行ける時、
    (i,j)からwarpで行ける範囲は、その上下もしくは左右でカバーされるので、(i,jは考えなくていい)
    """
    que1 = []
    que2 = []  # queueというよりはメモリ
    m[ch][cw] = str(0)
    que1.append((ch, cw))
    while que1 != []:
        l1 = len(que1)
        r1 = 0  # que1における使用済みindex
        # que1の要素(座標)から歩いていけるマス
        while r1 < l1:
            i, j = que1[r1]
            cnt_ud = 0
            # 隣接した上下のマスへの移動
            for si, sj in ud:
                if m[i + si][j + sj] == ".":
                    m[i + si][j + sj] = m[i][j]
                    que1.append((i + si, j + sj))
                    cnt_ud += 1
            cnt_lr = 0
            # 隣接した上下のマスへの移動
            for si, sj in lr:
                if m[i + si][j + sj] == ".":
                    m[i + si][j + sj] = m[i][j]
                    que1.append((i + si, j + sj))
                    cnt_lr += 1
            if cnt_ud == 2 or cnt_lr == 2:  # que1[r1]は不要
                que1.pop(r1)
                l1 += cnt_ud + cnt_lr - 1
            else:  # que1[r1]は必要
                r1 += 1
                l1 += cnt_ud + cnt_lr
        # 歩いていけないマス
        for i, j in que1:
            for si, sj in warp:
                if m[i + si][j + sj] == ".":
                    m[i + si][j + sj] = str(int(m[i][j]) + 1)
                    que2.append((i + si, j + sj))
        que1 = que2
        que2 = []


for i in range(h):
    m[i] = ["#"] * 2 + m[i] + ["#"] * 2
m = [["#"] * (w + 4)] * 2 + m + [["#"] * (w + 4)] * 2
ch += 1
cw += 1
dh += 1
dw += 1
bfs5()
if m[dh][dw] == ".":
    print((-1))
else:
    print((m[dh][dw]))

import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
# ---------標準入力時--------------
h, w = list(map(int, readline().split()))
ch, cw = list(map(int, readline().split()))
dh, dw = list(map(int, readline().split()))
m = list([list(x.decode()) for x in readlines()])
# ---------標準入力時--------------
ad = [(-1, 0), (0, -1), (1, 0), (0, 1)]
warp = [
    (-2, -2),
    (-2, -1),
    (-2, 0),
    (-2, 1),
    (-2, 2),
    (-1, -2),
    (-1, -1),
    (-1, 1),
    (-1, 2),
    (0, -2),
    (0, 2),
    (1, -2),
    (1, -1),
    (1, 1),
    (1, 2),
    (2, -2),
    (2, -1),
    (2, 0),
    (2, 1),
    (2, 2),
]


def bfs6():
    """
    bfs5から少し変更
    あるマス(i,j)から上(i-1,j)下(i+1,j) もしくは 左(i,j-1)右(i,j+1)に歩いて行ける時、
    (i,j)からwarpで行ける範囲は、その上下もしくは左右でカバーされるので、(i,jは考えなくていい)
    これをwarpを考えるときに処理する
    """
    que1 = []
    que2 = []  # queueというよりはメモリ
    m[ch][cw] = str(0)
    que1.append((ch, cw))
    while que1 != []:
        l1 = len(que1)
        r1 = 0  # que1における使用済みindex
        # que1の要素(座標)から歩いていけるマス
        while r1 < l1:
            i, j = que1[r1]
            r1 += 1
            for si, sj in ad:
                if m[i + si][j + sj] == ".":
                    m[i + si][j + sj] = m[i][j]
                    que1.append((i + si, j + sj))
                    l1 += 1
        # 歩いていけないマス
        for i, j in que1:
            if (m[i][j] == m[i - 1][j] and m[i][j] == m[i + 1][j]) or (
                m[i][j] == m[i][j - 1] and m[i][j] == m[i][j + 1]
            ):
                continue
            for si, sj in warp:
                if m[i + si][j + sj] == ".":
                    m[i + si][j + sj] = str(int(m[i][j]) + 1)
                    que2.append((i + si, j + sj))
        que1 = que2
        que2 = []


###---------------------------------------
for i in range(h):
    m[i] = ["#"] * 2 + m[i] + ["#"] * 2
m = [["#"] * (w + 4)] * 2 + m + [["#"] * (w + 4)] * 2
ch += 1
cw += 1
dh += 1
dw += 1
bfs6()
if m[dh][dw] == ".":
    print((-1))
else:
    print((m[dh][dw]))

-ud = [(-1, 0), (1, 0)]  # 上下 -lr = [(0, -1), (0, 1)]  # 左右 +ad = [(-1, 0), (0, -1), (1, 0), (0, 1)] -def bfs5(): +def bfs6(): -    bfs4から少し変更 +    bfs5から少し変更 +    これをwarpを考えるときに処理する -            cnt_ud = 0 -            # 隣接した上下のマスへの移動 -            for si, sj in ud: +            r1 += 1 +            for si, sj in ad: -                    cnt_ud += 1 -            cnt_lr = 0 -            # 隣接した上下のマスへの移動 -            for si, sj in lr: -                if m[i + si][j + sj] == ".": -                    m[i + si][j + sj] = m[i][j] -                    que1.append((i + si, j + sj)) -                    cnt_lr += 1 -            if cnt_ud == 2 or cnt_lr == 2:  # que1[r1]は不要 -                que1.pop(r1) -                l1 += cnt_ud + cnt_lr - 1 -            else:  # que1[r1]は必要 -                r1 += 1 -                l1 += cnt_ud + cnt_lr +                    l1 += 1 +            if (m[i][j] == m[i - 1][j] and m[i][j] == m[i + 1][j]) or ( +                m[i][j] == m[i][j - 1] and m[i][j] == m[i][j + 1] +            ): +                continue -bfs5() +bfs6()