using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using static System.Console;
using static System.Math;
using static AtCoderTemplate.MyLibrary;

namespace AtCoderTemplate
{
    class Program
    {
        static int ans = -1;
        static int H, W, CH, CW, DH, DW;
        static int[, ] B;
        static Queue<Tuple<int, int, int>> queue1;
        static Queue<Tuple<int, int, int>> queue2;
        static void Main (string[] args)
        {
            string[] str;
            str = Console.ReadLine ().Split (' ');

            H = int.Parse (str[0]);
            W = int.Parse (str[1]);

            str = Console.ReadLine ().Split (' ');
            CH = int.Parse (str[0]) - 1;
            CW = int.Parse (str[1]) - 1;

            str = Console.ReadLine ().Split (' ');
            DH = int.Parse (str[0]) - 1;
            DW = int.Parse (str[1]) - 1;

            // Console.WriteLine (CH + " " + CW + " " + "Start");
            // Console.WriteLine (DH + " " + DW + " " + "Goal");
            char[, ] S = new char[H, W];
            B = new int[H, W];

            for (int i = 0; i < H; i++)
            {
                string str2 = Console.ReadLine ();
                for (int j = 0; j < W; j++)
                {
                    S[i, j] = str2[j];
                    if (S[i, j] == '.')
                    {
                        B[i, j] = 0;

                    }
                    else
                    {
                        B[i, j] = 1;
                    }
                }
            }

            queue1 = new Queue<Tuple<int, int, int>> ();
            queue2 = new Queue<Tuple<int, int, int>> ();
            queue1.Enqueue (Tuple.Create (CH, CW, 0));
            queue2.Enqueue (Tuple.Create (CH, CW, 0));
            B[0, 0] = 1;
            while (queue1.Count > 0)
            {
                while (queue1.Count > 0)
                {

                    Tuple<int, int, int> tuple = queue1.Dequeue ();
                    // Console.WriteLine (tuple.Item1 + " " + tuple.Item2 + " " + "loop");
                    if (tuple.Item1 == DH && tuple.Item2 == DW)
                    {
                        ans = tuple.Item3;
                        Console.WriteLine (ans);
                        return;
                    }
                    else
                    {
                        if (B[tuple.Item1, tuple.Item2] == 0)
                        {
                            B[tuple.Item1, tuple.Item2] = 1;
                            queue2.Enqueue (Tuple.Create (tuple.Item1, tuple.Item2, tuple.Item3));
                        }
                        Search (tuple.Item1, tuple.Item2, tuple.Item3);
                    }
                }
                while (queue2.Count > 0)
                {
                    Tuple<int, int, int> tuple = queue2.Dequeue ();
                    if (tuple.Item1 == DH && tuple.Item2 == DW)
                    {
                        ans = tuple.Item3;
                        Console.WriteLine (ans);
                        return;
                    }
                    else
                    {
                        Warp (tuple.Item1, tuple.Item2, tuple.Item3);
                    }
                }
            }
            Console.WriteLine (ans);
        }

        static void Search (int h, int w, int cost)
        {
            int[] vh = { 0, 1, 0, -1 };
            int[] vw = { 1, 0, -1, 0 };

            for (int i = 0; i < 4; i++)
            {
                int nh = h + vh[i];
                int nw = w + vw[i];

                if (0 <= nh && nh < H && 0 <= nw && nw < W && B[nh, nw] == 0)
                {
                    // Console.WriteLine (nh + " " + nw + " " + cost);

                    queue1.Enqueue (Tuple.Create (nh, nw, cost));
                    queue2.Enqueue (Tuple.Create (nh, nw, cost));

                    B[nh, nw] = 1;
                }
            }
        }

        static void Warp (int h, int w, int cost)
        {
            for (int vh = 0; vh < 5; vh++)
            {
                for (int vw = 0; vw < 5; vw++)
                {

                    int nh = (h - 2) + vh;
                    int nw = (w - 2) + vw;
                    if (0 <= nh && nh < H && 0 <= nw && nw < W && B[nh, nw] == 0)
                    {
                        // Console.WriteLine (nh + " " + nw + " " + (cost + 1) + "Warp");
                        queue1.Enqueue (Tuple.Create (nh, nw, cost + 1));
                        // B[nh, nw] = 1;
                    }

                }
            }
        }

    }

    class MyLibrary
    {
        public static int GCD (int a, int b)
        {
            if (a % b == 0) return b;
            return GCD (b, a % b);
        }
    }
}

Measured memory_bytes: 53048