### BUGGY CODE ###

from collections import deque
import itertools
   


def main():
    h, w = map(int, input().split())
    ch, cw = map(int, input().split())
    ch -= 1
    cw -= 1
    dh, dw = map(int, input().split())
    dh -= 1
    dw -= 1
    maze = [input() for i in range(h)]
    visited = [[-1]*w for j in range(h)]
    
    def flatten(l):
        return list(itertools.chain.from_iterable(l))

    def list_unique(arr):
        return list(map(list, set(map(tuple, arr))))

    def maze_solver(maze, visited, sy, sx, gy, gx):
        mv = [[1, 0], [-1, 0], [0, 1], [0, -1]]
        q = deque([[sy, sx]])
        visited[sy][sx] = 0 
        _yx = list()
        _yx.append([sy, sx])
        while q:
            y, x = q.popleft()
            if y == gy and x == gx:
                ans = visited[y][x]
                _yx = list(map(list, set(map(tuple, _yx))))
                return ans, visited, _yx
            for i, j in mv:
                if (0 <= y + i < h) and (0 <= x + j < w):  
                    ny = y+i
                    nx = x+j
                    if visited[ny][nx] != -1:
                        continue
                    if maze[ny][nx] == '.':
                        visited[ny][nx] = visited[y][x] + 1 
                        q.append([ny, nx])
                        _yx.append([ny, nx])
                else:
                    continue
        ans = -1
        _yx = list(map(list, set(map(tuple, _yx))))
        return ans, visited, _yx

    def telepo(maze, visited, _yx, h, w):
        n_yx = list()
        for y, x in _yx:
            for ny in range(-2, 3):
                for nx in range(-2, 3):
                    if 0 <= y+ny < h and \
                        0 <= x+nx < w and \
                        visited[y+ny][x+nx] == -1 and \
                        maze[y+ny][x+nx] != '#': 
                        n_yx.append([y+ny, x+nx])
        # n_yx_s = list(map(list, set(map(tuple, n_yx))))
        n_yx_s = n_yx
        return n_yx_s

    telepo_cnt = 0
    ans, _visited, _yx = maze_solver(maze, visited, ch, cw, dh, dw)
    if ans != -1:
        # '一発目ワープ不要'
        print(telepo_cnt)
        exit()
    else:
        q = deque([telepo(maze, visited, _yx, h, w)])
        while len(q[0]) > 0:
            p = list()
            r = list()
            n_yx_s = q.popleft()
            telepo_cnt += 1
            for nyx in n_yx_s:
                # print(maze)
                # print(_visited)
                # print(nyx[0])
                # print(nyx[1])
                ans, _visted, _yx = maze_solver(maze, _visited, nyx[0], nyx[1], dh, dw)
                if ans != -1:
                    # 'ワープからのゴール'
                    print(telepo_cnt)
                    exit()
                else:
            #         for i in telepo(maze, visited, _yx, h, w):
            #             p.append(i)
            # print(p)
            # q.append(p)
                    #     print('p', p)
                    # #     p = list(map(list, set(map(tuple, p))))
                    # #     print('p#', p)
                    # # print(telepo(maze, visited, _yx, h, w))
                    # print('_yx', _yx)
                    r.append(telepo(maze, visited, _yx, h, w))
                    # print(r)
            r = flatten(r)
            # print(r)
            r = list_unique(r)
            # print(r)
            q.append(r)
        # 'ワープしても無理'
        print(-1)
                        
if __name__ == '__main__':
    main()

### FIXED CODE ###

def main():
    from collections import deque
    import sys
    input = sys.stdin.readline
    h, w = map(int, input().split())
    ch, cw = map(int, input().split())
    dh, dw = map(int, input().split())
    # 迷路の四方を##で囲む。
    # 移動で枠外にでてしまってindexがないことを阻止するための
    # if文を回避
    maze = ['#' * (w+4)]
    maze.append('#' * (w+4))
    for _ in range(h):
        maze.append('##' + input()[:-1] + '##')
    maze.append('#' * (w+4))
    maze.append('#' * (w+4))
    visited = [[-1] * (w+4) for _ in range(h+4)]
    for i in range(h+4):
        for j in range(w+4):
            if maze[i][j] == '#':
                visited[i][j] = -2
    # この条件ではindexを+1しないとダメ
    ch += 1
    cw += 1
    dh += 1
    dw += 1
    visited[ch][cw] = 0
    walk = [[1, 0], [-1, 0], [0, 1], [0, -1]]
    telepo = [[i,j] for i in range(-2, 3) for j in range(-2, 3)]

    q_walk = deque([[ch, cw]])
    q_telepo = deque([])
    while q_walk:
        yw, xw = q_walk.popleft()
        # 行った場所を管理
        q_telepo.append([yw, xw])
        for i, j in walk:
            ny, nx = yw + i, xw + j
            # if ny < 0 or h <= ny or nx < 0 or w <= nx:
            #     continue
            if visited[ny][nx] == -1:
                # 行ったことあれば0にしていく
                visited[ny][nx] = visited[yw][xw]
                q_walk.append([ny, nx])
        # 歩ける場所なくなったらワープ
        if len(q_walk) == 0:
            while q_telepo:
                yt, xt = q_telepo.popleft()
                for i, j in telepo:
                    my, mx = yt + i, xt + j
                    # if my < 0 or h <= my or mx < 0 or w <= mx:
                    #     continue
                    # 次がまだ行ったことないところだったら、今までの値に+1
                    # つまり、テレポートしないといけない場所
                    if visited[my][mx] == -1:
                        visited[my][mx] = visited[yt][xt] + 1
                        q_walk.append([my, mx])
    print(visited[dh][dw])

if __name__ == '__main__':
    main()