require 'set'; require 'prime'; require 'pp'
INF=Float::INFINITY; MOD=10**9+7

h,w = gets.chomp.split.map(&:to_i)
ch, cw = gets.chomp.split.map(&:to_i).map{|e| e-1}
dh, dw = gets.chomp.split.map(&:to_i).map{|e| e-1}
grid = []
# h = w= 100
# dh, dw = 99, 99
h.times do
  grid.push gets.chomp.chars
  # grid.push(('.' * w).chars)
end

q = []
q.push [0, ch, cw]
grid[ch][cw] = 0

ans = 10000000
until q.empty?
  count, y, x = q.shift
  break if count >= ans
  gridyx = grid[y][x]
  # p ['main', count, [y, x], gridyx]
  break if gridyx != '#' && gridyx != '.' && gridyx < count

  [y-2, 0].max.upto([y+2,h-1].min) do |ny|
    [x-2, 0].max.upto([x+2,w-1].min) do |nx|
      next if ny == y && nx == x
      ncount = count
      is_near = (ny-y).abs + (nx-x).abs <= 1
      ncount += 1 unless is_near

      val = grid[ny][nx]
      if ny == dh && nx == dw
        ans = [ans, ncount].min
      elsif val == '#'
      # skip
      elsif val == '.' || val > ncount
        grid[ny][nx] = ncount
        if is_near
          q.unshift [ncount, ny, nx]
        else
          q.push [ncount, ny, nx]
        end
      end
    end
  end
end

# grid.each{|l| p l }
if ans == 10000000
  puts -1
else
  puts ans
end
