#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010;
const int maxlen = 1e7 + 10;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
pair<pair<int, int>, int> q[maxlen];
char a[4][maxn][maxn];
int n, m, l = 1, r, to[1 << 8], nxt[1 << 8], dp[4][maxn][maxn];
void make(char ch, bool b1, bool b2, bool b3, bool b4) {
  to[ch] = (b1 << 0) + (b2 << 1) + (b3 << 2) + (b4 << 3);
}
void init() {
  nxt['+'] = '+';
  nxt['-'] = '|';
  nxt['|'] = '-';
  nxt['^'] = '>';
  nxt['>'] = 'v';
  nxt['<'] = '^';
  nxt['v'] = '<';
  nxt['L'] = 'U';
  nxt['R'] = 'D';
  nxt['U'] = 'R';
  nxt['D'] = 'L';
  nxt['*'] = '*';
  make('+', 1, 1, 1, 1);
  make('-', 0, 1, 0, 1);
  make('|', 1, 0, 1, 0);
  make('^', 1, 0, 0, 0);
  make('>', 0, 0, 0, 1);
  make('<', 0, 1, 0, 0);
  make('v', 0, 0, 1, 0);
  make('L', 1, 0, 1, 1);
  make('R', 1, 1, 1, 0);
  make('U', 0, 1, 1, 1);
  make('D', 1, 1, 0, 1);
  make('*', 0, 0, 0, 0);
}
bool pd(int x, int y) { return x > 0 && y > 0 && x <= n && y <= m; }
bool pass(int hx, int hy, int which, int chk) {
  return to[a[which][hx][hy]] & 1 << chk;
}
int main() {
  init();
  char buf[maxn];
  int sx, sy, tx, ty;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    gets(buf);
    for (int j = 1; j <= m; j++) {
      a[0][i][j] = getchar();
      for (int k = 1; k < 4; k++) {
        a[k][i][j] = nxt[a[k - 1][i][j]];
      }
    }
  }
  scanf("%d %d %d %d", &sx, &sy, &tx, &ty);
  if (sx == tx && sy == ty) {
    return puts("0"), 0;
  }
  dp[0][sx][sy] = 1;
  q[++r] = make_pair(make_pair(sx, sy), 0);
  for (; l <= r;) {
    pair<pair<int, int>, int> u = q[l++];
    int px = u.first.first, py = u.first.second, t = dp[u.second][px][py];
    if (!dp[(u.second + 1) % 4][px][py]) {
      dp[(u.second + 1) % 4][px][py] = t + 1;
      q[++r] = make_pair(u.first, (u.second + 1) % 4);
    }
    for (int i = 0; i < 4; i++) {
      int nx = px + dx[i], ny = py + dy[i];
      if (pd(nx, ny) && pass(px, py, u.second, i) &&
          pass(nx, ny, u.second, (i + 2) % 4)) {
        if (nx == tx && ny == ty) {
          printf("%d", t);
          return 0;
        }
        if (!dp[u.second][nx][ny]) {
          dp[u.second][nx][ny] = t + 1;
          q[++r] = make_pair(make_pair(nx, ny), u.second);
        }
      }
    }
  }
  puts("-1");
  return 0;
}
