#include <stdio.h>
#define N 1001
int book[N][N];
char a[N][N];
struct note
{
    int x;
    int y;
    int s;
};
int main() {
    int n, m, startx, starty, desx, desy;
    struct note que[10001000];

    int head = 0, tail = 0, cur_x, cur_y, flag = 0;
    int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//右下左上

    scanf("%d %d", &n, &m);
    scanf("%d%d%d%d", &startx, &starty, &desx, &desy);
    for(int i = 1; i <= n; i++)
    {
            scanf("%s",a[i]+1);// 从 a[i][1] 开始存储!!!
    }
  
	//若终点是障碍物则直接输出-1就好
    if(a[desx][desy] == '*')
    {
        printf("-1\n");
        return 0;
    }

    que[tail].x = startx;
    que[tail].y = starty;
    que[tail].s = 0;
    tail++;
    book[startx][starty] = 1;

    while(head<tail)
    {
        for(int i = 0; i < 4; i++)
        {
            cur_x = que[head].x + next[i][0];
            cur_y = que[head].y + next[i][1];
            if(cur_x<=0 || cur_x>n || cur_y<=0 || cur_y>m)//判断边界
                continue;
            if(a[cur_x][cur_y]=='.' && book[cur_x][cur_y]==0)//确定不是障碍物,也没有遍历过
            {
                book[cur_x][cur_y] = 1;
                que[tail].x = cur_x;
                que[tail].y = cur_y;
                que[tail].s = que[head].s + 1;
                tail++;
            }
            if(cur_x == desx && cur_y == desy)
            {
                flag = 1;
                printf("%d\n",que[tail-1].s);
                break;
            }
        }
        head++;
        if(flag)
            break;
    }
    if(!flag)
        printf("-1\n");
    return 0;
}