#include <bits/stdc++.h>
using namespace std;
const int maxn = 1500;
int tu[maxn][maxn][7];
int flag[maxn][maxn][7];
int rx[7] = {-1, 0, 1, 0};
int ry[7] = {0, 1, 0, -1};
int ju[7] = {1, 2, 4, 8, 16};
int n, m;
int Judge(char c) {
  if (c == '+') return 15;
  if (c == '|') return 5;
  if (c == '-') return 10;
  if (c == '^') return 1;
  if (c == '>') return 2;
  if (c == 'v') return 4;
  if (c == '<') return 8;
  if (c == 'L') return 7;
  if (c == 'R') return 13;
  if (c == 'U') return 14;
  if (c == 'D') return 11;
  if (c == '*') return 0;
}
int Rotate(int x) {
  x = x * 2;
  x = x + (x / 16);
  x = x & 15;
  return x;
}
struct Node {
  int x, y, k, v;
  Node() {}
  Node(int _x, int _y, int _k, int _v) : x(_x), y(_y), k(_k), v(_v) {}
};
queue<Node> q;
int main() {
  int ans, sx, sy, ex, ey;
  int x, y, k, v, nx, ny;
  Node tmp;
  char c;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf(" %c", &c);
      tu[i][j][0] = Judge(c);
      for (k = 1; k < 4; k++) tu[i][j][k] = Rotate(tu[i][j][k - 1]);
    }
  }
  scanf("%d%d", &sx, &sy);
  scanf("%d%d", &ex, &ey);
  q.push(Node(sx, sy, 0, 0));
  ans = -1;
  flag[sx][sy][0] = 1;
  while (!q.empty()) {
    tmp = q.front();
    q.pop();
    x = tmp.x;
    y = tmp.y;
    k = tmp.k;
    v = tmp.v;
    if (x == ex && y == ey) {
      ans = v;
      break;
    }
    if (!flag[x][y][(k + 1) % 4]) {
      q.push(Node(x, y, (k + 1) % 4, v + 1));
      flag[x][y][(k + 1) % 4] = 1;
    }
    for (int i = 0; i < 4; i++) {
      nx = x + rx[i];
      ny = y + ry[i];
      if (nx < 1 || nx > n) continue;
      if (ny < 1 || ny > m) continue;
      if (flag[nx][ny][k]) continue;
      if (!((tu[x][y][k] % ju[i + 1]) / ju[i])) continue;
      if (!((tu[nx][ny][k] % ju[(i + 2) % 4 + 1]) / ju[(i + 2) % 4])) continue;
      flag[nx][ny][k] = 1;
      q.push(Node(nx, ny, k, v + 1));
    }
  }
  printf("%d\n", ans);
}
