using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ABC176D
{
    class Program
    {
        static int[,] map;
        static Queue<int> warpq;
        static void Main(string[] args)
        {
            string[] HW = Console.ReadLine().Split(' ');
            int H = int.Parse(HW[0]);
            int W = int.Parse(HW[1]);
            string[] Cinput = Console.ReadLine().Split(' ');
            int Ch = int.Parse(Cinput[0]);
            int Cw = int.Parse(Cinput[1]);
            string[] Dinput = Console.ReadLine().Split(' ');
            int Dh = int.Parse(Dinput[0]);
            int Dw = int.Parse(Dinput[1]);
            map = new int[H+4, W+4];
            for(int i = 0; i < W + 4; i++)
            {
                map[0, i] = -1;
                map[1, i] = -1;
                map[H+2, i] = -1;
                map[H+3, i] = -1;
            }
            for(int i = 2; i < H+2; i++)
            {
                string Sinput = Console.ReadLine();
                for(int j = 2; j < W+2; j++)
                {
                    map[i, 0] = -1;
                    map[i, 1] = -1;
                    if (Sinput[j - 2].ToString() == "#")
                    {
                        map[i, j] = -1;
                    }
                    map[i, W+2] = -1;
                    map[i, W+3] = -1;
                }
            }
            warpq = new Queue<int>();
            map[Ch + 2 - 1, Cw + 2 - 1] = 1;
            tansaku(Ch + 2 - 1, Cw + 2 - 1, 1);
            while (warpq.Count > 0)
            {
                int l = warpq.Count;
                for(int i = 0; i < l / 2; i++)
                {
                    int starth = warpq.Dequeue();
                    int startw = warpq.Dequeue();
                    tansaku(starth, startw, map[starth,startw]);
                }
            }
            if (map[Dh + 2 - 1, Dw + 2 - 1] == -1)
            {
                Console.WriteLine(-1);
            }
            else
            {
                Console.WriteLine(map[Dh + 2 - 1, Dw + 2 - 1] - 1);
            }
        }

        static void tansaku(int H,int W,int num)
        {
            Queue<int> q = new Queue<int>();
            if (map[H - 1, W] == 0 || map[H - 1, W] > num)
            {
                map[H - 1, W] = num;
                q.Enqueue(H - 1);
                q.Enqueue(W);
            }
            if (map[H + 1, W] == 0 || map[H + 1, W] > num)
            {
                map[H + 1, W] = num;
                q.Enqueue(H + 1);
                q.Enqueue(W);
            }
            if (map[H, W - 1] == 0 || map[H, W - 1] > num)
            {
                map[H, W - 1] = num;
                q.Enqueue(H);
                q.Enqueue(W - 1);
            }
            if (map[H, W + 1] == 0 || map[H, W + 1] > num)
            {
                map[H, W + 1] = num;
                q.Enqueue(H);
                q.Enqueue(W + 1);
            }
            while (q.Count > 0)
            {
                int h = q.Dequeue();
                int w = q.Dequeue();
                tansaku(h, w, num);
            }
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (Math.Abs(i - 2) + Math.Abs(j - 2) > 1)
                        {
                            if (map[H - 2 + i, W - 2 + j] == 0 || map[H - 2 + i, W - 2 + j] > num + 1)
                            {
                                map[H - 2 + i, W - 2 + j] = num + 1;
                                warpq.Enqueue(H - 2 + i);
                                warpq.Enqueue(W - 2 + j);
                            }
                        }
                    }
                }
            return;
        }
    }
}


Measured memory_bytes: 50172