#include <bits/stdc++.h>
using namespace std;
int maxvc = (int)1e8 + 6;
struct cell {
  int x, y, v, stt;
};
int n, m, xt, yt, xm, ym;
queue<cell> mq;
int a[1007][1007][4];
bool f[1007][1007][4];
int dong[4] = {-1, 0, 1, 0};
int cot[4] = {0, 1, 0, -1};
int road1[4] = {1, 2, 4, 8};
int road2[4] = {4, 8, 1, 2};
void openFile() { freopen("input.txt", "r", stdin); }
int ff(int x) {
  if ((x & 8) == 8) {
    return (x - 8) * 2 + 1;
  } else {
    return x * 2;
  }
}
int kcstt(int x, int y) {
  if (y > x) return y - x;
  return y + 4 - x;
}
bool inTB(int x, int y) {
  if (x > n || x < 1) return false;
  if (y > m || y < 1) return false;
  return true;
}
void solve() {
  string st;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> st;
    for (int j = 1; j <= m; j++) {
      switch (st[j - 1]) {
        case '+':
          a[i][j][0] = 15;
          break;
        case '-':
          a[i][j][0] = 10;
          break;
        case '|':
          a[i][j][0] = 5;
          break;
        case '^':
          a[i][j][0] = 1;
          break;
        case '>':
          a[i][j][0] = 2;
          break;
        case '<':
          a[i][j][0] = 8;
          break;
        case 'v':
          a[i][j][0] = 4;
          break;
        case 'L':
          a[i][j][0] = 7;
          break;
        case 'R':
          a[i][j][0] = 13;
          break;
        case 'U':
          a[i][j][0] = 14;
          break;
        case 'D':
          a[i][j][0] = 11;
          break;
        case '*':
          a[i][j][0] = 0;
          break;
        default:
          break;
      }
      for (int k = 1; k <= 3; k++) a[i][j][k] = ff(a[i][j][k - 1]);
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      for (int k = 0; k <= 3; k++) {
        f[i][j][k] = true;
      }
  cin >> xt >> yt;
  cin >> xm >> ym;
  if (xt == xm && yt == ym) {
    cout << 0;
    return;
  }
  cell tmp, u, v;
  tmp.x = xt;
  tmp.y = yt;
  tmp.v = 0;
  tmp.stt = 0;
  f[xt][yt][0] = false;
  mq.push(tmp);
  while (!mq.empty()) {
    u = mq.front();
    mq.pop();
    int nstt = (u.stt + 1) % 4;
    if (f[u.x][u.y][nstt]) {
      f[u.x][u.y][nstt] = false;
      tmp.x = u.x;
      tmp.y = u.y;
      tmp.v = u.v + 1;
      tmp.stt = nstt;
      mq.push(tmp);
    }
    for (int i = 0; i <= 3; i++) {
      int vx = u.x + dong[i];
      int vy = u.y + cot[i];
      if (!inTB(vx, vy)) continue;
      if (!f[vx][vy][u.stt]) continue;
      if (((a[u.x][u.y][u.stt] & road1[i]) == road1[i]) &&
          ((a[vx][vy][u.stt] & road2[i]) == road2[i])) {
        f[vx][vy][u.stt] = false;
        tmp.x = vx;
        tmp.y = vy;
        tmp.v = u.v + 1;
        tmp.stt = u.stt;
        mq.push(tmp);
        if (vx == xm && vy == ym) {
          cout << tmp.v;
          return;
        }
      }
    }
  }
  cout << -1;
}
int main() {
  solve();
  return 0;
}
