h, w = gets.split.map(&:to_i)
ch, cw = gets.split.map(&:to_i)
ch += 1
cw += 1
cp = ch * (w+4) + cw
dh, dw = gets.split.map(&:to_i)
dh += 1
dw += 1
dp = dh * (w+4) + dw
s = '#' * (w+4) * 2
h.times do
  s << '##' + gets.chop + '##'
end
s << '#' * (w+4) * 2

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

    if np == dp
      puts current_cost
      exit 0
    end

    if s[np-w-4] == '.' && !checked[np-w-4]
      seek.push np-w-4
      checked[np-w-4] = true
      q.push np-w-4
    end
    if s[np+w+4] == '.' && !checked[np+w+4]
      seek.push np+w+4
      checked[np+w+4] = true
      q.push np+w+4
    end
    if s[np-1] == '.' && !checked[np-1]
      seek.push np-1
      checked[np-1] = true
      q.push np-1
    end
    if s[np+1] == '.' && !checked[np+1]
      seek.push np+1
      checked[np+1] = true
      q.push np+1
    end
  end
  tmp_seek = []

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

        if tp == dp
          puts current_cost + 1
          exit 0
        end

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