#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:10240000,10240000")
using namespace std;
const double PI = acos(-1.0);
const double EPS = 1e-10;
inline int read() {
  static char ch;
  bool sgn = false;
  while (ch = getchar(), ch < '0' || ch > '9')
    if (ch == '-') sgn = true;
  int res = ch - 48;
  while (ch = getchar(), ch >= '0' && ch <= '9') res = res * 10 + ch - 48;
  return sgn ? -res : res;
}
struct Node {
  int x, y, z;
  Node(int a, int b, int c) {
    x = a;
    y = b;
    z = c;
  }
};
int xt, yt, xm, ym, n, m;
char a[1101][1101], s[1005];
int dis[1101][1101][4], dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1},
                        b[1101][1110][4];
bool bo[1100][1100][4];
queue<Node> q;
bool check(int x, int y, int z, int xx, int yy, int i) {
  if (i == 0)
    return b[x][y][(0 - z + 4) % 4] == b[xx][yy][(2 - z + 4) % 4] &&
           b[xx][yy][(2 - z + 4) % 4] == 1;
  if (i == 3)
    return b[x][y][(3 - z + 4) % 4] == b[xx][yy][(1 - z + 4) % 4] &&
           b[xx][yy][(1 - z + 4) % 4] == 1;
  if (i == 2)
    return b[x][y][(2 - z + 4) % 4] == b[xx][yy][(0 - z + 4) % 4] &&
           b[xx][yy][(0 - z + 4) % 4] == 1;
  if (i == 1)
    return b[x][y][(1 - z + 4) % 4] == b[xx][yy][(3 - z + 4) % 4] &&
           b[xx][yy][(3 - z + 4) % 4] == 1;
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    for (int j = 1; j <= m; j++) a[i][j] = s[j];
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (a[i][j] == '+')
        for (int k = 0; k < 4; k++) b[i][j][k] = 1;
      if (a[i][j] == '-') b[i][j][1] = b[i][j][3] = 1;
      if (a[i][j] == '|') b[i][j][0] = b[i][j][2] = 1;
      if (a[i][j] == '^') b[i][j][0] = 1;
      if (a[i][j] == '>') b[i][j][1] = 1;
      if (a[i][j] == '<') b[i][j][3] = 1;
      if (a[i][j] == 'v') b[i][j][2] = 1;
      if (a[i][j] == 'L') b[i][j][0] = b[i][j][1] = b[i][j][2] = 1;
      if (a[i][j] == 'R') b[i][j][0] = b[i][j][3] = b[i][j][2] = 1;
      if (a[i][j] == 'U') b[i][j][3] = b[i][j][1] = b[i][j][2] = 1;
      if (a[i][j] == 'D') b[i][j][0] = b[i][j][1] = b[i][j][3] = 1;
    }
  }
  xt = read();
  yt = read();
  xm = read();
  ym = read();
  memset(dis, -1, sizeof(dis));
  dis[xt][yt][0] = 0;
  q.push(Node(xt, yt, 0));
  while (!q.empty()) {
    Node qq = q.front();
    q.pop();
    int x = qq.x, y = qq.y, z = qq.z;
    if (x == xm && y == ym) {
      cout << dis[x][y][z];
      return 0;
    }
    for (int i = 0; i < 4; i++) {
      int xx = x + dx[i], yy = y + dy[i], zz = z;
      if (xx <= 0 || xx > n || yy > m || yy <= 0) continue;
      if (!check(x, y, z, xx, yy, i)) continue;
      if (dis[xx][yy][zz] == -1) {
        q.push(Node(xx, yy, zz));
        dis[xx][yy][zz] = dis[x][y][z] + 1;
      } else {
        if (dis[xx][yy][zz] > dis[x][y][z] + 1) {
          dis[xx][yy][zz] = dis[x][y][z] + 1;
          q.push(Node(xx, yy, zz));
        }
      }
    }
    if (dis[x][y][(z + 1) % 4] == -1 ||
        dis[x][y][(z + 1) % 4] > dis[x][y][z] + 1) {
      dis[x][y][(z + 1) % 4] = dis[x][y][z] + 1;
      q.push(Node(x, y, (z + 1) % 4));
    }
  }
  puts("-1");
}
