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)
  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, y + 1].product([x - 1, x, x + 1]) do |y_, x_|
      next if y_ < 0 || x_ < 0 || y_ >= H || x_ >= W

      v = W * y_ + x_
      next if used[v]

      if MAP[y_][x_] == '#'
        used[v] = true
        wall << v
      elsif (y - y_).abs + (x - x_).abs <= 1
        used[v] = true
        q << v
      end
    end
  end
  wall
end

def bfs1(wall, dist, d)
  wall.each_with_object([]) do |u, jump|
    y,x = u.divmod(W)
    [y - 1, y, y + 1].product([x - 1, x, x + 1]) do |y_,x_|
      next if y_ < 0 || x_ < 0 || y_ >= H || x_ >= W
      v = W * y_ + x_
      if MAP[y_][x_] == '.' && dist[v] < 0
        dist[v] = d
        jump << v
      end
    end
  end
end

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

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