#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 69 * 69 + 69;
struct lol {
  int rot, x, y;
  lol(int _r = 0, int _x = 0, int _y = 0) {
    rot = _r;
    x = _x;
    y = _y;
  }
};
int i, j, rot, n, m, si, sj, fi, fj, x, y, newx, newy, dp[5][1005][1005], rs;
char c, xc;
string a[5][1005];
queue<lol> Q;
char getNext(char c) {
  if (c == '+') return '+';
  if (c == '-') return '|';
  if (c == '|') return '-';
  if (c == '^') return '>';
  if (c == '>') return 'v';
  if (c == '<') return '^';
  if (c == 'v') return '<';
  if (c == 'L') return 'U';
  if (c == 'R') return 'D';
  if (c == 'U') return 'R';
  if (c == 'D') return 'L';
  return '*';
}
bool ok(int x, int y) {
  if (x < 0 || x >= n) return 0;
  if (y < 0 || y >= m) return 0;
  return 1;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  for (i = 0; i < n; ++i) cin >> a[0][i];
  cin >> si >> sj >> fi >> fj;
  --si;
  --sj;
  --fi;
  --fj;
  for (rot = 1; rot < 4; ++rot)
    for (i = 0; i < n; ++i)
      for (a[rot][i] = a[rot - 1][i], j = 0; j < m; ++j)
        a[rot][i][j] = getNext(a[rot - 1][i][j]);
  for (rot = 0; rot < 4; ++rot)
    for (i = 0; i < n; ++i)
      for (j = 0; j < m; ++j) dp[rot][i][j] = INF;
  Q.push(lol(0, si, sj));
  dp[0][si][sj] = 0;
  for (; !Q.empty(); Q.pop()) {
    rot = Q.front().rot;
    x = Q.front().x;
    y = Q.front().y;
    c = a[rot][x][y];
    if (c == '*' || (x == fi && y == fj)) continue;
    for (i = 1; i < 4; ++i) {
      if (dp[(rot + i) % 4][x][y] <= dp[rot][x][y] + i) continue;
      dp[(rot + i) % 4][x][y] = dp[rot][x][y] + i;
      Q.push(lol((rot + i) % 4, x, y));
    }
    if (c == '+' || c == '|' || c == '^' || c == 'L' || c == 'R' || c == 'D') {
      newx = x - 1;
      newy = y;
      if (ok(newx, newy) && dp[rot][newx][newy] > dp[rot][x][y] + 1) {
        xc = a[rot][newx][newy];
        if (xc == '+' || xc == '|' || xc == 'v' || xc == 'L' || xc == 'R' ||
            xc == 'U') {
          dp[rot][newx][newy] = dp[rot][x][y] + 1;
          Q.push(lol(rot, newx, newy));
        }
      }
    }
    if (c == '+' || c == '|' || c == 'v' || c == 'L' || c == 'R' || c == 'U') {
      newx = x + 1;
      newy = y;
      if (ok(newx, newy) && dp[rot][newx][newy] > dp[rot][x][y] + 1) {
        xc = a[rot][newx][newy];
        if (xc == '+' || xc == '|' || xc == '^' || xc == 'L' || xc == 'R' ||
            xc == 'D') {
          dp[rot][newx][newy] = dp[rot][x][y] + 1;
          Q.push(lol(rot, newx, newy));
        }
      }
    }
    if (c == '+' || c == '-' || c == '>' || c == 'L' || c == 'U' || c == 'D') {
      newx = x;
      newy = y + 1;
      if (ok(newx, newy) && dp[rot][newx][newy] > dp[rot][x][y] + 1) {
        xc = a[rot][newx][newy];
        if (xc == '+' || xc == '-' || xc == '<' || xc == 'R' || xc == 'U' ||
            xc == 'D') {
          dp[rot][newx][newy] = dp[rot][x][y] + 1;
          Q.push(lol(rot, newx, newy));
        }
      }
    }
    if (c == '+' || c == '-' || c == '<' || c == 'R' || c == 'U' || c == 'D') {
      newx = x;
      newy = y - 1;
      if (ok(newx, newy) && dp[rot][newx][newy] > dp[rot][x][y] + 1) {
        xc = a[rot][newx][newy];
        if (xc == '+' || xc == '-' || xc == '>' || xc == 'L' || xc == 'U' ||
            xc == 'D') {
          dp[rot][newx][newy] = dp[rot][x][y] + 1;
          Q.push(lol(rot, newx, newy));
        }
      }
    }
  }
  for (rot = 0, rs = INF; rot < 4; ++rot) rs = min(rs, dp[rot][fi][fj]);
  if (rs >= 1e9) return cout << "-1\n", 0;
  cout << rs << '\n';
  return 0;
}
