require "set"

class UnionFind
  Node = Struct.new(:p, :h)
  def initialize(size); @p, @r = size.times.to_a, [0]*size; end
  def unite(i, j); k, l = parent(i), parent(j); if @r[k] < @r[l]; @p[k] = l; @r[l] += 1 if @r[k] == @r[l]; else; @p[l] = k; end; end
  def united?(i, j); parent(i) == parent(j); end
  def parent(i); j = i; until i == @p[i]; j, i = i, @p[j] = @p[i]; end; i; end
end

h, w = gets.to_s.split.map {|s|s.to_i}.to_a
ch, cw = gets.to_s.split.map {|s|s.to_i}.to_a
dh, dw = gets.to_s.split.map {|s|s.to_i}.to_a
s = h.times.map {gets.to_s.chomp}.to_a

uf = UnionFind.new h*w

h.times do |i|
  w.times do |j|
    next if s[i][j] != '.'
    uf.unite i*w+j, (i+1)*w+j if i+1 < h && s[i+1][j] == '.'
    uf.unite i*w+j, (i-1)*w+j if i > 1 && s[i-1][j] == '.'
    uf.unite i*w+j, i*w+j+1 if j+1 < w && s[i][j+1] == '.'
    uf.unite i*w+j, i*w+j-1 if j > w && s[i][j-1] == '.'
  end
end

#p uf

parents = (h*w).times.map {|i|uf.parent i}.uniq
n = parents.size
parentidxs = {}
parents.each_with_index {|x, i| parentidxs[x] = i}

graph = parents.map {Set.new}

h.times do |i|
  w.times do |j|
    next if s[i][j] != '.'
    x = parentidxs[uf.parent i*w+j]
    5.times do |di|
      5.times do |dj|
        next if di == 2 and dj == 2
        pi, pj = i+di-2, j+dj-2
        next if pi < 0 or pi >= h or pj < 0 or pj >= w or s[pi][pj] == '#'
        graph[x] << parentidxs[uf.parent pi*w+pj]
      end
    end
  end
end

start = parentidxs[uf.parent (ch-1)*w+cw-1]
goal = parentidxs[uf.parent (dh-1)*w+dw-1]

#p parents

prevs = [0] * graph.size
#queue = HeapBinary.new { |i, j| dists[i] <=> dists[j] }
#graph.size.times { |i|queue << i }
queue = [[start, 0]]
visited = [false] * graph.size
visited[start] = true
until queue.empty?
  i, c = queue.shift
  if i == goal
    p c
    exit
  end
  graph[i].each do |j|
    if !visited[j]
      visited[j] = true
      queue << [j, c+1]
    end
  end
end

p -1