using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
using static System.Math;

class MainClass : Scanner
{
    static int[] dy = new int[4] { 0, 1, 0, -1 };
    static int[] dx = new int[4] { 1, 0, -1, 0 };
    static void Main()
    {
        var (H, W) = ReadStream<int, int>();
        var sp = ReadStream<int, int>();
        var gp = ReadStream<int, int>();
        var map = new bool[H, W];
        var cost = new int[H, W];
        for (int i = 0; i < H; i++)
        {
            var S = RString();
            for (int j = 0; j < W; j++)
            {
                map[i, j] = S[j] == '#';
                cost[i, j] = int.MaxValue;
            }
        }

        var que = new Queue<(int y, int x,int c)>();
        var que2 = new Queue<(int y, int x, int c)>();
        que.Enqueue((sp.Item1 - 1, sp.Item2 - 1,0));
        que2.Enqueue((sp.Item1 - 1, sp.Item2 - 1, 0));
        while (que.Count > 0)
        {


            while (que.Count > 0)
            {
                var v = que.Dequeue();
                que2.Enqueue(v);
                for (int i = 0; i < 4; i++)
                {
                    int nx = v.x + dx[i], ny = v.y + dy[i];
                    if (0 <= nx && nx < W && 0 <= ny && ny < H)
                    {
                        if (cost[ny, nx] <= v.c||map[ny, nx]) continue;
                        cost[ny, nx] = v.c;
                        que.Enqueue((ny, nx, v.c));
                        
                    }
                }

            }
            while (que2.Count > 0)
            {
                var v = que2.Dequeue();
                for (int i = -2; i <= 2; i++)
                {
                    for (int j = -2; j <= 2; j++)
                    {
                        int nx = v.x + i, ny = v.y + j, nc = v.c + 1;
                        if (0 <= nx && nx < W && 0 <= ny && ny < H)
                        {
                            if (cost[ny, nx] <= nc || map[ny, nx]) continue;
                            cost[ny, nx] = nc;
                            que.Enqueue((ny, nx, nc));
                        }
                    }
                }
            }
        }
        if (cost[gp.Item1 - 1, gp.Item2 - 1] == int.MaxValue) WriteLine(-1);
        else WriteLine(cost[gp.Item1 - 1, gp.Item2 - 1]);
    }
}

class Scanner
{
    public static int RInt() => int.Parse(Console.ReadLine());
    public static long RLong() => long.Parse(Console.ReadLine());
    public static string RString() => Console.ReadLine();
    public static double RDouble() => double.Parse(Console.ReadLine());

    public static int[] RInts() => Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
    public static int[] RInts(Func<string, int> func) => Console.ReadLine().Split().Select(func).ToArray();
    public static long[] RLongs() => Array.ConvertAll(Console.ReadLine().Split(), long.Parse);
    public static long[] RLongs(Func<string, long> func) => Console.ReadLine().Split().Select(func).ToArray();
    public static double[] RDoubles() => Array.ConvertAll(Console.ReadLine().Split(), double.Parse);
    public static double[] RDoubles(Func<string, double> func) => Console.ReadLine().Split().Select(func).ToArray();
    public static string[] RStrings() => Console.ReadLine().Split();
    //public static string[] RStrings(Func<string, string> func) => Console.ReadLine().Split().Select(func).ToArray();
    public static T1 ReadStream<T1>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        return r1;
    }
    public static (T1, T2) ReadStream<T1, T2>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        var r2 = (T2)Convert.ChangeType(r[1], typeof(T2));
        return (r1, r2);
    }
    public static (T1, T2, T3) ReadStream<T1, T2, T3>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        var r2 = (T2)Convert.ChangeType(r[1], typeof(T2));
        var r3 = (T3)Convert.ChangeType(r[2], typeof(T3));
        return (r1, r2, r3);
    }
    public static (T1, T2, T3, T4) ReadStream<T1, T2, T3, T4>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        var r2 = (T2)Convert.ChangeType(r[1], typeof(T2));
        var r3 = (T3)Convert.ChangeType(r[0], typeof(T3));
        var r4 = (T4)Convert.ChangeType(r[0], typeof(T4));
        return (r1, r2, r3, r4);
    }
}

Measured memory_bytes: 36020