def coordinate(s,x,y)
  s[y][x]
end

def can_move?(group_1, group_2)
  group_1.each do |ele|
    (-2..2).each do |i|
      (-2..2).each do |j|
        if group_2.include?([ele[0] + i, ele[1] + j])
          return true
        end
      end
    end
  end
  return false
end

def possible_move_groups(groups, now_group)
  possible_move_groups = []
  groups.each do |group|
    possible_move_groups << group if can_move?(group, now_group)
  end
  possible_move_groups
end


H, W  = gets.split(' ').map(&:to_i)
CH, CW = gets.split(' ').map(&:to_i)
DH, DW = gets.split(' ').map(&:to_i)
s = [Array.new(W, '#')]


H.times do
  s << ['#'] + gets.chomp.split('')
end

coordinates = [] # H*Wの座標が入っている [[1, 1], [2, 1], [3, 1], [4, 1], ...]
(1..H).each do |h|
  (1..W).each do |w|
    coordinates << [w, h]
  end
end

miti_masues = []

coordinates.each do |coordinate|
  if coordinate(s, coordinate[0], coordinate[1]) == '.'
    miti_masues << coordinate
  end
end

groups = []
loop do
  group = [miti_masues.first]
  miti_masues.delete(miti_masues.first)
  gensen_gourp = []

  loop do
    group_add = []

    migi = [group.last[0] + 1, group.last[1]]
    hidari = [group.last[0] - 1, group.last[1]]
    ue = [group.last[0], group.last[1] + 1]
    sita = [group.last[0], group.last[1] - 1]
    [migi, hidari, ue, sita].each do |ele|
      if miti_masues.include?(ele)
        group_add << ele
        miti_masues.delete(ele)
      end
    end

    gensen_gourp += [group.last]
    group.pop
    group += group_add
    break if group.length == 0
  end
  groups << gensen_gourp
  break if miti_masues.length == 0
end

start_group = []
goal_group = []

groups.each do |group|
  start_group = group if group.include?([CW, CH])
  goal_group = group if group.include?([DW, DH])
end

ans = 0

cost_groups_array = [[start_group]] #cost0のグループのgroupを0番目の要素に。

loop do
  cost_groups = cost_groups_array.last
  groups -= cost_groups

  next_cost_groups = []

  cost_groups.each do  |cost_group|
    next_cost_groups += possible_move_groups(groups, cost_group)
  end

  cost_groups_array << next_cost_groups

  groups -= next_cost_groups
  break if groups == [] || next_cost_groups == []
end

find_flag = false
cost_groups_array.each_with_index do |group, i|
  if group.include?(goal_group)
    puts i
    find_flag = true
  end
end
puts -1 unless find_flag
