### BUGGY CODE ###

from collections import deque

INF = 10**6
walk_area=[(1,0), (0,1), (-1,0), (0,-1)]
warp_area=[]
for i in range(-2, 3):
    for j in range(-2, 3):
        warp_area.append((i, j))

def main():
    h, w = map(int, input().split())
    ch, cw = map(lambda x: int(x) + 1, input().split())
    dh, dw = map(lambda x: int(x) + 1, input().split())
    S = ['#'*(w+4)]
    S.append('#'*(w+4))
    for i in range(h):
        S.append('##'+input()+'##')
    S.append('#'*(w+4))
    S.append('#'*(w+4))
    
    # 各場所までワープ何回で辿り着くか
    COST = [[INF for i in range(w+4)] for j in range(h+4)]
    COST[ch][cw] = 0

    d = deque([[ch,cw,0]])
    d2 = deque()
    while len(d) > 0:
        t = d.popleft()
        d2.append(t)
        x = t[0]
        y = t[1]
        num = t[2] # COST[x][y]
        for dx, dy in walk_area:
            X = x + dx
            Y = y + dy
            if S[X][Y] == '#' or COST[X][Y] <= num:
                continue
        
            COST[X][Y] = num
            d.append([X, Y, num])
        if not d:
            while len(d2) > 0:
                x, y, num = d2.popleft()
                for dx, dy in warp_area:
                    X = x + dx
                    Y = y + dy
                    if S[X][Y] == '#' or COST[X][Y] <= num+1:
                        continue
                    
                    COST[X][Y] = num + 1
                    d.append([X, Y, num + 1])
    # for i in COST:
    #     print(i)
    if COST[dh][dw] == 10**6:
        print(-1)
    else:
        print(COST[dh][dw])
    return

if __name__ == '__main__':
    main()

### FIXED CODE ###

from collections import deque

INF = 10**6
walk_area=[(1,0), (0,1), (-1,0), (0,-1)]
warp_area=[]
for i in range(-2, 3):
    for j in range(-2, 3):
        warp_area.append((i, j))
    
def walk(a, b, num, S, COST):
    m = S[a][b] 
    if m == '.':
        COST[a][b] = num
        # d.appendleft([a, b])
        return
    else:
        # d.append
        return

def warp(x,y,num, S, COST, d):
    m = S[x][y]
    if m == '.':
        COST[x][y] = num
        d.append([x, y])
        return
    if m == '#':
        return
    S[x][y] = min(num, m)
    return

def main():
    h, w = map(int, input().split())
    ch, cw = map(lambda x: int(x) + 1, input().split())
    dh, dw = map(lambda x: int(x) + 1, input().split())
    S = ['#'*(w+4)]
    S.append('#'*(w+4))
    for i in range(h):
        S.append('##'+input()+'##')
    S.append('#'*(w+4))
    S.append('#'*(w+4))
    
    # 各場所までワープ何回で辿り着くか
    COST = [[INF for i in range(w+4)] for j in range(h+4)]
    COST[ch][cw] = 0

    d = deque([[ch,cw,0]])
    d2 = deque()
    while len(d) > 0:
        t = d.popleft()
        d2.append(t)
        x = t[0]
        y = t[1]
        num = t[2] # COST[x][y]
        for dx, dy in walk_area:
            X = x + dx
            Y = y + dy
            if S[X][Y] == '#' or COST[X][Y] <= num:
                continue
        
            COST[X][Y] = num
            d.append([X, Y, num])
        if not d:
            while len(d2) > 0:
                x, y, num = d2.popleft()
                for dx, dy in warp_area:
                    X = x + dx
                    Y = y + dy
                    if S[X][Y] == '#' or COST[X][Y] <= num+1:
                        continue
                    
                    COST[X][Y] = num + 1
                    d.append([X, Y, num + 1])
    # for i in COST:
    #     print(i)
    if COST[dh][dw] == 10**6:
        print(-1)
    else:
        print(COST[dh][dw])
    return

if __name__ == '__main__':
    main()