#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int ma[N][N];
map<char, int> h;
struct Node {
  int x, y, k, a;
  Node(){};
  Node(int x, int y, int k, int a) : x(x), y(y), k(k), a(a){};
};
queue<Node> qu;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
const char* ch = "+-|^><vLRUD*";
const int ih[] = {15, 10, 5, 1, 8, 2, 4, 13, 7, 14, 11, 0};
int xx, yy, n, m;
bool b[N][N][4];
int ro(int x, int y) {
  while (y--) {
    int t = x & 1;
    x >>= 1;
    x += (t << 3);
  }
  return x;
}
void bfs(int w, int v) {
  while (!qu.empty()) qu.pop();
  qu.push(Node(w, v, 0, 0));
  b[w][v][0] = 1;
  Node h;
  int x, y, z;
  while (!qu.empty()) {
    h = qu.front();
    qu.pop();
    for (int i = 0; i < 4; i++) {
      x = h.x + dx[i];
      y = h.y + dy[i];
      z = h.k;
      int tmp = 1 << i;
      if (!b[x][y][z] && x && y && x <= n && y <= m) {
        int l = ro(ma[h.x][h.y], z);
        if ((l & tmp) == 0) continue;
        int r = ro(ma[x][y], z + 2);
        if ((r & tmp) == 0) continue;
        if (x == xx && y == yy) {
          printf("%d\n", h.a + 1);
          return;
        }
        b[x][y][z] = 1;
        qu.push(Node(x, y, z, h.a + 1));
      }
    }
    x = h.x;
    y = h.y;
    z = (h.k + 1) % 4;
    if (!b[x][y][z]) b[x][y][z] = 1, qu.push(Node(x, y, z, h.a + 1));
  }
  printf("-1\n");
}
int main() {
  for (int i = 0; i < 12; i++) h[ch[i]] = ih[i];
  memset(ma, 0, sizeof(ma));
  while (~scanf("%d%d", &n, &m)) {
    memset(b, 0, sizeof(b));
    char c;
    for (int i = 1; i <= n; i++) {
      getchar();
      for (int j = 1; j <= m; j++) {
        c = getchar();
        ma[i][j] = h[c];
      }
    }
    int x, y;
    scanf("%d%d", &x, &y);
    scanf("%d%d", &xx, &yy);
    if (x == xx && y == yy)
      printf("0\n");
    else
      bfs(x, y);
  }
  return 0;
}
