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, dist, d)
  used = Array.new(H * W)
  q = starts
  q.each{|u| used[u] = true }
  wall = []
  until q.empty?
    u = q.shift
    dist[u] = d
    y,x = u.divmod(W)
    (y - 1 .. y + 1).each do |y_|
      (x - 1 .. x + 1).each do |x_|
        next if y_ < 0 || x_ < 0 || y_ >= H || x_ >= W
        v = W * y_ + x_
        next if used[v]
        used[v] = true
        if MAP[y_][x_] == '#'
          wall << v
        elsif (y - y_).abs + (x - x_).abs <= 1
          q << v
        end
      end
    end
  end
  wall
end

def bfs1(wall, dist)
  used = Array.new(H * W)
  unreached = []
  
  wall.each do |u|
    y,x = u.divmod(W)
    (y - 1 .. y + 1).each do |y_|
      (x - 1 .. x + 1).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
          unreached << v
        end
      end
    end
  end
  unreached
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, d|
  break if reach.empty?
  touched = bfs0(reach, dist, d)
  break if dist[T] >= 0
  next_reach = bfs1(touched, dist)
end
puts dist[T]
