require 'set'
h, w = gets.split.map(&:to_i)
ch, cw = gets.split.map(&:to_i)
ch += 1
cw += 1
dh, dw = gets.split.map(&:to_i)
dh += 1
dw += 1
s = Array.new(h+4)
h.times do |i|
  s[i+2] = ('##' + gets.chop + '##').chars
end
s[0] = ['#'] * (w+4)
s[1] = ['#'] * (w+4)
s[h+2] = ['#'] * (w+4)
s[h+3] = ['#'] * (w+4)

q = [[ch, cw]]
seek = []
current_cost = 0
checked = Array.new(h+4) { Array.new(w+4) }
checked[ch][cw] = true
loop do
  # 同コスト内のノード幅優先探索
  break if q.empty?
  until q.empty?
    nh, nw = q.shift

    if [nh, nw] == [dh, dw]
      puts current_cost
      exit 0
    end
    c = 4

    if s[nh-1][nw] == '.'
      c -= 1
      unless checked[nh-1][nw]
        checked[nh-1][nw] = true
        q.push [nh-1, nw]
      end
    end
    if s[nh+1][nw] == '.'
      c -= 1
      unless checked[nh+1][nw]
        checked[nh+1][nw] = true
        q.push [nh+1, nw]
      end
    end
    if s[nh][nw-1] == '.'
      c -= 1
      unless checked[nh][nw-1]
        checked[nh][nw-1] = true
        q.push [nh, nw-1]
      end
    end
    if s[nh][nw+1] == '.'
      c -= 1
      unless checked[nh][nw+1]
        checked[nh][nw+1] = true
        q.push [nh, nw+1]
      end
    end
    seek << [nh, nw] if c > 0
  end
  tmp_seek = []

  # 次のコストのノードの発見とキューイング
  seek.each do |eh, ew|
    (eh-2..eh+2).each do |th|
      (ew-2..ew+2).each do |tw|
        next if s[th][tw] != '.' || checked[th][tw]

        if [th, tw] == [dh, dw]
          puts current_cost + 1
          exit 0
        end

        tmp_seek.push [th, tw]
        checked[th][tw] = true
        q.push [th, tw]
      end
    end
  end
  seek = tmp_seek
  current_cost += 1
end
puts -1
