H, W = gets.split.map(&:to_i)
sy, sx = gets.split.map(&:to_i)
ty, tx = gets.split.map(&:to_i)
MAP = H.times.map{ gets.chomp }

def bfs0(q, dist, d)
  q.each{|u| dist[u] = d }
  visited = []
  until q.empty?
    u = q.shift
    visited << u
    y,x = u.divmod(W)
    (y - 1 .. y + 1).each do |y_|
      (x - 1 .. x + 1).each do |x_|
        next if y_ < 0 || y_ >= H || x_ < 0 || x_ >= W
        next if (y - y_).abs + (x - x_).abs > 1
        v = W * y_ + x_
        if MAP[y_][x_] == '.' && dist[v] < 0
          dist[v] = d
          q << v
        end
      end
    end
  end
  visited
end

def bfs1(visited, dist, d)
  jump = []
  visited.each do |u|
    y,x = u.divmod(W)
    (y - 2 .. y + 2).each do |y_|
      (x - 2 .. x + 2).each do |x_|
        next if y_ < 0 || x_ < 0 || y_ >= H || x_ >= W
        next if (y - y_).abs + (x - x_).abs <= 1

        v = W * y_ + x_
        if MAP[y_][x_] == '.' && dist[v] < 0
          dist[v] = d
          jump << v
        end
      end
    end
  end
  jump
end

S = W * (sy - 1) + sx - 1
T = W * (ty - 1) + tx - 1
dist = Array.new(H * W, -1)

(0 .. 1_000_000).inject([S]) do |visitable, d|
  break if visitable.empty?
  visited = bfs0(visitable, dist, d)
  break if dist[T] >= 0
  bfs1(visited, dist, d + 1)
end
puts dist[T]
