def input_n
  gets.to_i               # 単一整数
end

def input_s
  gets.chomp              # 文字列。chompを付けないと改行文字がついてくる
end

def input_a
  gets.split.map(&:to_i)  # スペースで区切られた複数の整数
end

def input_o(num)
  num.times.map { gets.to_i }  # 縦に並んだ複数の整数。たまにある
end

def output_f(num)
  puts sprintf("%.12f", num)
end

def input_n
  gets.to_i               # 単一整数
end

def input_s
  gets.chomp              # 文字列。chompを付けないと改行文字がついてくる
end

def input_a
  gets.split.map(&:to_i)  # スペースで区切られた複数の整数
end

def input_o(num)
  num.times.map { gets.to_i }  # 縦に並んだ複数の整数。たまにある
end

def output_f(num)
  puts sprintf("%.12f", num)
end

h, w = input_a
start_h, start_w = input_a
goal_h, goal_w = input_a
reached = Array.new(h).map { Array.new(w, false) }

# 移動方向
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
ddx = [-2, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2]
ddy = [2, 1, 0, -1, -2, 2, 1, -1, -2, 2, -2, 2, 1, -1, -2, 2, 1, 0, -1, -2]

# 地図読み取り
tiles = Array.new(h)
h.times do |i|
  tiles[i] = gets.chomp.chars
end

warp = 0
while 1
  stack = []
  stack.push([start_h, start_w])

  while !stack.empty?
    hh, ww = stack.pop
    reached[hh][ww] = true

    # 四方向を探索
    4.times do |i|
      nh = hh + dx[i]
      nw = ww + dy[i]

      # 地図の外に出る場合は飛ばす
      next if nh < 0 || nh >= h || nw < 0 || nw >= w
      # 向かう先が壁の場合は飛ばす
      next if tiles[nh][nw] == "#"
      # 移動先が探索済みだった場合飛ばす
      next if reached[nh][nw]

      # if !((dx[i] == 0 && dy[i] == 1) || (dx[i] == 1 && dy[i] == 0) || (dx[i] == 0 && dy[i] == -1) && (dx[i] == -1 && dy[i] == 0))
      #   warp += 1
      # end

      # 再帰的に探索
      stack.push([nh, nw])
    end
  end

  # goalに到達しているか判定
  if reached[goal_h - 1][goal_w - 1]
    puts warp
    exit
  end

  is_warp = 0
  stack.push([start_h, start_w])
  while !stack.empty?
    hh, ww = stack.pop
    reached[hh][ww] = true

    # 四方向を探索
    20.times do |i|
      nh = hh + ddx[i]
      nw = ww + ddy[i]

      # 地図の外に出る場合は飛ばす
      next if nh < 0 || nh >= h || nw < 0 || nw >= w
      # 向かう先が壁の場合は飛ばす
      next if tiles[nh][nw] == "#"
      # 移動先が探索済みだった場合飛ばす
      if !reached[nh][nw]
        warp += 1
        start_h = nh
        start_w = nw
        stack = []
        is_warp = 1
        break
      end

      # 再帰的に探索
      stack.push([nh, nw])
    end
  end
  if is_warp == 0
    puts -1
    exit
  end
end
