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(starts)
  q = starts.dup
  used = Array.new(H * W)
  q.each{|u| used[u] = true }
  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_] == '.' && !used[v]
          used[v] = true
          q << v
        end
      end
    end
  end
  visited
end

def bfs1(starts, dist)
  visited = []
  used = Array.new(H * W)
  
  starts.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 && !used[v]
          used[v] = true
          visited << v
        end
      end
    end
  end
  visited
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 |reach, i|
  break if reach.empty?
  visited = bfs0(reach)
  visited.each do |u|
    dist[u] = i
  end
  break if dist[T] >= 0
  bfs1(visited, dist)
end
puts dist[T]
