using System;
using System.Collections.Generic;
using System.Linq;
//0-1 BFS //LinkedList
//コストが1だけの時=>queue
//コストが0or1の時=>deque=>O(1)
//似ているのは、ダイクストラ法=>O(n)

class Program
{
    static void Main()
    {
        int[] In = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int h = In[0];
        int w = In[1];
        int[] In2 = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int sx = In2[0];
        int sy = In2[1];
        sx--; sy--;
        int[] In3 = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int gx = In3[0];
        int gy = In3[1];
        gx--; gy--;
        char[,] C = new char[h, w];
        for (int i = 0; i < h; i++)
        {
            string s = Console.ReadLine();
            for (int j = 0; j < w; j++)
            {
                C[i, j] = s[j];
            }
        }
        var dis = new int[h, w];
        int INF = 1001001001;
        for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) dis[i, j] = INF;
        //BFS
        var deque = new LinkedList<Pair>();
        dis[sx, sy] = 0;
        deque.AddLast(new Pair(sx, sy));
        while (deque.Count() > 0)
        {
            var p = deque.First();
            deque.RemoveFirst();
            //壁を越えない範囲で更新する
            for (int i = 0; i < 4; i++)
            {
                int nx = p.x + dx[i];
                int ny = p.y + dy[i];
                if (nx < 0 || h <= nx || ny < 0 || w <= ny) continue;
                if (C[nx, ny] == '#') continue;
                if (dis[nx, ny] <= dis[p.x, p.y]) continue;
                dis[nx, ny] = dis[p.x, p.y];
                deque.AddFirst(new Pair(nx, ny));
            }
            //超えられる壁を探す
            for(int ei = -2; ei <= 2; ei++)
            {
                for(int ej = -2; ej <= 2; ej++)
                {
                    int nx = p.x + ei;
                    int ny = p.y + ej;
                    if(nx < 0 || h <= nx || ny < 0 || w <= ny) continue;
                    if (C[nx, ny] == '#') continue;
                    if (dis[nx, ny] <= dis[p.x, p.y]+1) continue;
                    dis[nx, ny] = dis[p.x, p.y]+1;
                    deque.AddLast(new Pair(nx, ny));
                }
            }
        }
        if (dis[gx, gy] == INF) Console.WriteLine(-1);
        else Console.WriteLine(dis[gx, gy]);
    }
    public static int[] dx = { 0, 1, 0, -1 };
    public static int[] dy = { 1, 0, -1, 0 };
    public struct Pair
    {
        public int x, y;
        public Pair(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
}


//WA
//namespace D
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int[] In = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
//            int h = In[0];
//            int w = In[1];
//            int[] In2 = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
//            int sx = In2[0];
//            int sy = In2[1];
//            sx--; sy--;
//            int[] In3 = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
//            int gx = In3[0];
//            int gy = In3[1];
//            gx--; gy--;
//            char[,] S = new char[h, w];
//            for (int i = 0; i < h; i++)
//            {
//                string s = Console.ReadLine();
//                for (int j = 0; j < w; j++)
//                {
//                    S[i, j] = s[j];
//                }
//            }
//            int[,] dis = new int[h, w];
//            int INF = 1001001001;
//            for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) dis[i, j] = INF;
//            dis[sx, sy] = 0;
//            var que = new Queue<Pair>();
//            que.Enqueue(new Pair(sx, sy));
//            while (dis[gx, gy] == INF)
//            {
//                //いける範囲を埋める
//                while (que.Count > 0)
//                {
//                    var p = que.Dequeue();
//                    if (p.x == gx && p.y == gy) break;
//                    for (int i = 0; i < 4; i++)
//                    {
//                        int nx = p.x + dx[i];
//                        int ny = p.y + dy[i];
//                        if (nx < 0 || h <= nx || ny < 0 || w <= ny || S[nx, ny] == '#' || dis[nx, ny] != INF) continue;
//                        que.Enqueue(new Pair(nx, ny));
//                        dis[nx, ny] = dis[p.x, p.y];
//                    }
//                }
//                int[,] Cpy= new int[h,w];
//                Array.Copy(dis, Cpy, h * w);
//                bool change = false;
//                for(int x = 0; x < h; x++)
//                {
//                    for (int y = 0; y < w; y++)
//                    {
//                        if (dis[x, y] == INF) continue;
//                        for (int i = -2; i <= 2; i++)
//                        {
//                            for (int j = -2; j <= 2; j++)
//                            {
//                                int wx = x + i;
//                                int wy = y + j;
//                                if (wx < 0 || h <= wx || wy < 0 || w <= wy || S[wx, wy] == '#' || dis[wx, wy] != INF) continue;
//                                if (Cpy[wx, wy] < dis[x, y] + 1) continue;
//                                Cpy[wx, wy] = dis[x, y] + 1;
//                                change = true;
//                            }
//                        }
//                    }
//                }
//                if (!change) break;
//                Array.Copy(Cpy,dis, h * w);
//            }
//            if (dis[gx, gy] == INF) Console.WriteLine(-1);
//            else Console.WriteLine(dis[gx,gy]);
//        }
//        public static int[] dx = { 0, 1, 0, -1 };
//        public static int[] dy = { 1, 0, -1, 0 };
//        public struct Pair
//        {
//            public int x, y;
//            public Pair(int x, int y)
//            {
//                this.x = x;
//                this.y = y;
//            }
//        }
//    }
//}

//namespace D
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int[] In = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
//            int h = In[0];
//            int w = In[1];
//            int[] In2 = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
//            int sx = In2[0];
//            int sy = In2[1];
//            sx--;sy--;
//            int[] In3 = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
//            int gx = In3[0];
//            int gy = In3[1];
//            gx--;gy--;
//            char[,] S = new char[h, w];
//            for(int i = 0; i < h; i++)
//            {
//                string s = Console.ReadLine();
//                for (int j = 0; j < w; j++)
//                {
//                    S[i,j] = s[j];
//                }
//            }
//            int[,] dis = new int[h, w];
//            int INF = 1001001001;
//            for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) dis[i, j] = INF;
//            dis[sx, sy] = 0;
//            var que = new Queue<Pair>();
//            que.Enqueue(new Pair(sx, sy));
//            int warp = 0;
//            while (dis[gx,gy]==INF)
//            {
//                //いける範囲を埋める
//                while (que.Count > 0)
//                {
//                    var p = que.Dequeue();
//                    if (p.x == gx && p.y == gy) break;
//                    for (int i = 0; i < 4; i++)
//                    {
//                        int nx = p.x + dx[i];
//                        int ny = p.y + dy[i];
//                        if (nx < 0 || h <= nx || ny < 0 || w <= ny || S[nx, ny] == '#' || dis[nx, ny] != INF) continue;
//                        que.Enqueue(new Pair(nx, ny));
//                        dis[nx, ny] = dis[p.x, p.y] + 1;
//                    }
//                }
//                if (dis[gx, gy] != INF) break;
//                //壁を超える
//                bool change = false;
//                bool[,] renew = new bool[h, w];
//                for (int i = 0; i < h; i++)
//                {
//                    for (int j = 0; j < w; j++)
//                    {
//                        for (int x = -2; x <= 2; x++)
//                        {
//                            for (int y = -2; y <= 2; y++)
//                            {
//                                int mx = i + x;
//                                int my = j + y;
//                                if (mx < 0 || h <= mx || my < 0 || w <= my || S[mx, my] == '#'|| S[i,j]=='#') continue;
//                                if (renew[mx, my]) continue;
//                                if (dis[i, j] > dis[mx, my] + 1)
//                                {
//                                    if(i==gx && j == gy) { }
//                                    renew[i, j] = true;
//                                    dis[i, j] = dis[mx, my] + 1;
//                                    change = true;
//                                }
//                            }
//                        }
//                    }
//                }
//                if (change) warp++;
//                else 
//                {
//                    warp = -1;
//                    break;
//                };
//            }

//            Console.WriteLine(warp);
//        }
//        public static int[] dx = { 0, 1, 0, -1 };
//        public static int[] dy = { 1, 0, -1, 0 };
//        public struct Pair
//        {
//            public int x, y;
//            public Pair(int x, int y)
//            {
//                this.x = x;
//                this.y = y;
//            }
//        }
//    }
//}

//for (int x = -2; x <= 2; x++)
//{
//    for (int y = -2; y <= 2; y++)
//    {
//        int mx = nx + x;
//        int my = ny + y;
//        if (mx < 0 || h <= mx || my < 0 || w <= my || S[mx, my] == '#' || dis[mx, my] != INF) continue;
//        if (dis[ny, ny] > dis[mx, my] + 1)
//        {
//            dis[nx, ny] = dis[mx, my] + 1;
//            warp++;
//        }
//    }
//}

//while (que.Count > 0)
//{
//    var p = que.Dequeue();
//    if (p.x == gx && p.y == gy) break;
//    for (int i = 0; i < 4; i++)
//    {
//        int nx = p.x + dx[i];
//        int ny = p.y + dy[i];
//        if (nx < 0 || h <= nx || ny < 0 || w <= ny || S[nx, ny] == '#' || dis[nx, ny] != INF) continue;
//        que.Enqueue(new Pair(nx, ny));
//        dis[nx, ny] = dis[p.x, p.y] + 1;
//    }
//}

Measured memory_bytes: 53284