#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1005;
const int INF = 1 << 30;
int n, m, xs, xf, ys, yf;
char a[4][NMAX][NMAX];
int d[4][NMAX][NMAX];
bool inq[4][NMAX][NMAX];
deque<pair<int, pair<int, int>>> q;
bool u(int dir, int x, int y) {
  char c = a[dir][x][y];
  return c == '+' || c == '|' || c == '^' || c == 'L' || c == 'R' || c == 'D';
}
bool r(int dir, int x, int y) {
  char c = a[dir][x][y];
  return c == '+' || c == '-' || c == '>' || c == 'L' || c == 'U' || c == 'D';
}
bool dd(int dir, int x, int y) {
  char c = a[dir][x][y];
  return c == '+' || c == '|' || c == 'v' || c == 'L' || c == 'R' || c == 'U';
}
bool l(int dir, int x, int y) {
  char c = a[dir][x][y];
  return c == '+' || c == '-' || c == '<' || c == 'U' || c == 'R' || c == 'D';
}
void update(int dir, int x, int y, int newdir, int newx, int newy) {
  if (newx < 1 || newx > n || newy < 1 || newy > m) return;
  if (d[dir][x][y] + 1 < d[newdir][newx][newy]) {
    d[newdir][newx][newy] = d[dir][x][y] + 1;
    if (!inq[newdir][newx][newy]) {
      inq[newdir][newx][newy] = 1;
      q.push_back({newdir, {newx, newy}});
    }
  }
}
int main() {
  cin.sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> (a[0][i] + 1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      if (a[0][i][j] == '+') {
        for (int k = 1; k < 4; k++) {
          a[k][i][j] = '+';
        }
      } else if (a[0][i][j] == '-') {
        a[1][i][j] = '|';
        a[2][i][j] = '-';
        a[3][i][j] = '|';
      } else if (a[0][i][j] == '|') {
        a[1][i][j] = '-';
        a[2][i][j] = '|';
        a[3][i][j] = '-';
      } else if (a[0][i][j] == '^') {
        a[1][i][j] = '>';
        a[2][i][j] = 'v';
        a[3][i][j] = '<';
      } else if (a[0][i][j] == '>') {
        a[1][i][j] = 'v';
        a[2][i][j] = '<';
        a[3][i][j] = '^';
      } else if (a[0][i][j] == 'v') {
        a[1][i][j] = '<';
        a[2][i][j] = '^';
        a[3][i][j] = '>';
      } else if (a[0][i][j] == '<') {
        a[1][i][j] = '^';
        a[2][i][j] = '>';
        a[3][i][j] = 'v';
      } else if (a[0][i][j] == 'L') {
        a[1][i][j] = 'U';
        a[2][i][j] = 'R';
        a[3][i][j] = 'D';
      } else if (a[0][i][j] == 'U') {
        a[1][i][j] = 'R';
        a[2][i][j] = 'D';
        a[3][i][j] = 'L';
      } else if (a[0][i][j] == 'R') {
        a[1][i][j] = 'D';
        a[2][i][j] = 'L';
        a[3][i][j] = 'U';
      } else if (a[0][i][j] == 'D') {
        a[1][i][j] = 'L';
        a[2][i][j] = 'U';
        a[3][i][j] = 'R';
      } else {
        for (int k = 1; k < 4; k++) {
          a[k][i][j] = '*';
        }
      }
    }
  cin >> xs >> ys >> xf >> yf;
  q.push_back({0, {xs, ys}});
  inq[0][xs][ys] = 1;
  for (int k = 0; k < 4; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) d[k][i][j] = INF;
  d[0][xs][ys] = 0;
  while (!q.empty()) {
    int dir = q.front().first;
    int x = q.front().second.first;
    int y = q.front().second.second;
    q.pop_front();
    inq[dir][x][y] = 0;
    update(dir, x, y, (dir + 1) % 4, x, y);
    if (a[dir][x][y] == '+') {
      if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);
      if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);
      if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);
      if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);
    } else if (a[dir][x][y] == '-') {
      if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);
      if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);
    } else if (a[dir][x][y] == '|') {
      if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);
      if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);
    } else if (a[dir][x][y] == '^') {
      if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);
    } else if (a[dir][x][y] == '>') {
      if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);
    } else if (a[dir][x][y] == 'v') {
      if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);
    } else if (a[dir][x][y] == '<') {
      if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);
    } else if (a[dir][x][y] == 'L') {
      if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);
      if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);
      if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);
    } else if (a[dir][x][y] == 'U') {
      if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);
      if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);
      if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);
    } else if (a[dir][x][y] == 'R') {
      if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);
      if (u(dir, x + 1, y)) update(dir, x, y, dir, x + 1, y);
      if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);
    } else if (a[dir][x][y] == 'D') {
      if (dd(dir, x - 1, y)) update(dir, x, y, dir, x - 1, y);
      if (l(dir, x, y + 1)) update(dir, x, y, dir, x, y + 1);
      if (r(dir, x, y - 1)) update(dir, x, y, dir, x, y - 1);
    }
  }
  int sol = INF;
  for (int i = 0; i < 4; i++) sol = min(sol, d[i][xf][yf]);
  if (sol == INF) sol = -1;
  cout << sol;
  return 0;
}
