#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, t;
  node(){};
  node(int a, int b, int c) : l(a), r(b), t(c){};
};
char g[4][1005][1005];
int f[1005][1005][4];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
int n, m;
queue<node> p;
bool zuo(char x) {
  if (x == '<' || x == 'D' || x == 'R' || x == 'U' || x == '+' || x == '-')
    return true;
  else
    return false;
}
bool you(char x) {
  if (x == '>' || x == 'L' || x == 'D' || x == 'U' || x == '+' || x == '-')
    return true;
  else
    return false;
}
bool shang(char x) {
  if (x == '^' || x == 'L' || x == 'R' || x == 'D' || x == '+' || x == '|')
    return true;
  else
    return false;
}
bool xia(char x) {
  if (x == 'v' || x == 'L' || x == 'R' || x == 'U' || x == '+' || x == '|')
    return true;
  else
    return false;
}
bool pk(int x, int y, int t, int u) {
  if (u == 0) {
    if (xia(g[t][x][y]) && shang(g[t][x + 1][y]))
      return true;
    else
      return false;
  }
  if (u == 1) {
    if (you(g[t][x][y]) && zuo(g[t][x][y + 1]))
      return true;
    else
      return false;
  }
  if (u == 2) {
    if (shang(g[t][x][y]) && xia(g[t][x - 1][y]))
      return true;
    else
      return false;
  }
  if (u == 3) {
    if (zuo(g[t][x][y]) && you(g[t][x][y - 1]))
      return true;
    else
      return false;
  }
}
char fp(char x) {
  if (x == '+' || x == '*') return x;
  if (x == '-') return '|';
  if (x == '|') return '-';
  if (x == '^') return '>';
  if (x == '>') return 'v';
  if (x == 'v') return '<';
  if (x == '<') return '^';
  if (x == 'L') return 'U';
  if (x == 'R') return 'D';
  if (x == 'D') return 'L';
  if (x == 'U') return 'R';
}
int bfs(node s, int aa, int bb) {
  p.push(s);
  node u;
  int xx, yy, tt, i, nx, ny, d;
  while (!p.empty()) {
    u = p.front();
    p.pop();
    xx = u.l;
    yy = u.r;
    tt = u.t;
    if (g[tt][xx][yy] != '*') {
      for (i = 0; i < 4; i++) {
        nx = xx + dx[i];
        ny = yy + dy[i];
        if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && pk(xx, yy, tt, i) &&
            f[nx][ny][tt] == -1 && g[tt][nx][ny] != '*') {
          f[nx][ny][tt] = f[xx][yy][tt] + 1;
          p.push(node(nx, ny, tt));
        }
      }
      if (f[xx][yy][(tt + 1) % 4] == -1) {
        f[xx][yy][(tt + 1) % 4] = f[xx][yy][tt] + 1;
        p.push(node(xx, yy, (tt + 1) % 4));
      }
    }
  }
  d = 1000000007;
  for (i = 0; i < 4; i++) {
    if (f[aa][bb][i] != -1) d = min(d, f[aa][bb][i]);
  }
  if (d == 1000000007)
    return -1;
  else
    return d;
}
int main() {
  int i, j, k, a, b;
  node s;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%s", g[0][i] + 1);
  for (k = 1; k < 4; k++) {
    for (i = 1; i <= n; i++) {
      for (j = 1; j <= m; j++) g[k][i][j] = fp(g[k - 1][i][j]);
    }
  }
  memset(f, -1, sizeof(f));
  scanf("%d%d", &a, &b);
  f[a][b][0] = 0;
  s = node(a, b, 0);
  scanf("%d%d", &a, &b);
  printf("%d\n", bfs(s, a, b));
  return 0;
}
