### BUGGY CODE ###

from collections import deque
import sys
import numpy as np
# input = sys.stdin.buffer.readline
H, W = map(int, input().split())
ch, cw = map(int, input().split())
ch, cw = ch - 1, cw - 1  # 0-indexed
dh, dw = map(int, input().split())
dh, dw = dh - 1, dw - 1  # 0-indexed
# print(f'{ch=}, {cw=}')
S = []
for _ in range(H):
    S.append(list(input()))
S = np.array(S)
# print(f'{S=}')

G = np.full_like(S, -1, dtype='int')
# print(f'{G=}')

current_G = 0
for h in range(H):
    for w in range(W):
        if S[h, w] == '#':
            continue
        if G[h, w] != -1:
            continue
        G[h, w] = current_G
        q = deque([(h, w)])
        while q:
            # print(f'{q=}')
            _h, _w = q.popleft()
            # print(f'{_h=}, {_w=}')
            for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
                nx = _w + dx
                ny = _h + dy
                # print(f'{nx=}, {ny=}')
                if nx < 0 or ny < 0 or nx >= W or ny >= H:
                    # print(f'fuga {nx=}, {ny=}')
                    continue
                if S[ny, nx] == '#':
                    continue
                if G[ny, nx] != -1:
                    # print(f'hoge')
                    continue
                G[ny, nx] = current_G
                q.append((ny, nx))
        current_G += 1
#         print(f'')
# print(f'{G=}')
# print(f'{current_G=}')

# print(f'start group = {G[ch, cw]=}')
start_group = G[ch, cw]

P = [-1] * (current_G)
P[start_group] = 0
# print(f'{P=}')

g = start_group
GG = deque([start_group])
while GG:
    g = GG.popleft()
    for h in range(H):
        for w in range(W):
            if G[h, w] == g:
                for dx, dy in ((-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)):
                    nx = w + dx
                    ny = h + dy
                    if nx < 0 or ny < 0 or nx >= W or ny >= H:
                        continue
                    if S[ny, nx] == '#':
                        continue
                    _g = G[ny, nx]
                    if P[_g] != -1:
                        continue
                    P[_g] = P[g] + 1
                    GG.append(_g)

# print(f'{P=}')
# print(f'goal group = {G[dh, dw]=}')
ans = P[G[dh, dw]]
print(ans)


### FIXED CODE ###

from collections import deque
from collections import defaultdict
# input = sys.stdin.buffer.readline
H, W = map(int, input().split())
ch, cw = map(int, input().split())
ch, cw = ch - 1, cw - 1  # 0-indexed
dh, dw = map(int, input().split())
dh, dw = dh - 1, dw - 1  # 0-indexed
# print(f'{ch=}, {cw=}')
S = []
for _ in range(H):
    S.append(list(input()))
# S = np.array(S)
# print(f'{S=}')

# G = np.full_like(S, -1, dtype='int')
G = []
for _ in range(H):
    G.append([-1] * W)
# print(f'{G=}')

current_G = 0
group_dic = defaultdict(list)
for h in range(H):
    for w in range(W):
        if S[h][w] == '#':
            continue
        if G[h][w] != -1:
            continue
        G[h][w] = current_G
        group_dic[current_G].append((h, w))
        q = deque([(h, w)])
        while q:
            # print(f'{q=}')
            _h, _w = q.popleft()
            # print(f'{_h=}, {_w=}')
            for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
                nx = _w + dx
                ny = _h + dy
                # print(f'{nx=}, {ny=}')
                if nx < 0 or ny < 0 or nx >= W or ny >= H:
                    # print(f'fuga {nx=}, {ny=}')
                    continue
                if S[ny][nx] == '#':
                    continue
                if G[ny][nx] != -1:
                    # print(f'hoge')
                    continue
                G[ny][nx] = current_G
                q.append((ny, nx))
                group_dic[current_G].append((ny, nx))
        current_G += 1
#         print(f'')
# print(f'{G=}')
# print(f'{current_G=}')
# print(f'{group_dic=}')

if current_G == 1:
    print(0)
    exit()

# print(f'start group = {G[ch][cw]=}')
start_group = G[ch][cw]

P = [-1] * (current_G)
P[start_group] = 0
# print(f'{P=}')

g = start_group
GG = deque([start_group])
while GG:
    g = GG.popleft()
    for h, w in group_dic[g]:
        for dx, dy in ((-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)):
            nx = w + dx
            ny = h + dy
            if nx < 0 or ny < 0 or nx >= W or ny >= H:
                continue
            if S[ny][nx] == '#':
                continue
            _g = G[ny][nx]
            if P[_g] != -1:
                continue
            P[_g] = P[g] + 1
            GG.append(_g)

# print(f'{P=}')
# print(f'goal group = {G[dh][dw]=}')
ans = P[G[dh][dw]]
print(ans)