#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline string get() {
  char ch[10000];
  scanf("%s", ch);
  return ch;
}
const int MAX_LG = 21;
const long long maxn = 1e3 + 10;
const long long base = 29;
const long long mod = 84691;
const long long INF = 1e9;
const long long maxq = 2e5 + 10;
priority_queue<pair<pair<long long, long long>, pair<long long, long long> > >
    pq;
long long a[maxn][maxn];
long long di[maxn][maxn];
long long di2[maxn][maxn][4];
bool mark[maxn][maxn][4];
long long dx[] = {0, 0, -1, 1};
long long dy[] = {1, -1, 0, 0};
inline char convert(char ch, long long times) {
  if (!times) return ch;
  if (ch == '+') return ch;
  if (ch == '*') return ch;
  if (ch == '>') return convert('v', times - 1);
  if (ch == 'v') return convert('<', times - 1);
  if (ch == '<') return convert('^', times - 1);
  if (ch == '^') return convert('>', times - 1);
  if (ch == '-') return convert('|', times - 1);
  if (ch == '|') return convert('-', times - 1);
  if (ch == 'L') return convert('U', times - 1);
  if (ch == 'U') return convert('R', times - 1);
  if (ch == 'R') return convert('D', times - 1);
  if (ch == 'D') return convert('L', times - 1);
  assert(0);
}
int32_t main() {
  long long n = in(), m = in();
  for (long long i = 0; i < n; i++) {
    string s = get();
    for (long long j = 0; j < m; j++) {
      a[i][j] = s[j];
      di[i][j] = di2[i][j][0] = di2[i][j][1] = di2[i][j][2] = di2[i][j][3] =
          1e9;
    }
  }
  long long x1 = in() - 1, y1 = in() - 1, x2 = in() - 1, y2 = in() - 1;
  pq.push({{0, 0}, {x1, y1}});
  di[x1][y1] = 0;
  while (pq.empty() == false) {
    long long dis = -pq.top().first.first;
    long long tp = pq.top().first.second;
    long long x = pq.top().second.first;
    long long y = pq.top().second.second;
    pq.pop();
    if (mark[x][y][tp]) continue;
    mark[x][y][tp] = true;
    di[x][y] = min(di[x][y], dis);
    if (make_pair(x, y) == make_pair(x2, y2)) break;
    char c = convert(a[x][y], tp);
    for (long long i = 0; i < 4; i++) {
      long long x2 = x + dx[i], y2 = y + dy[i];
      if (x2 >= 0 && x2 < n && y2 >= 0 && y2 < m) {
        if (mark[x2][y2][tp] || di[x2][y2] <= dis - 4) continue;
        char c2 = convert(a[x2][y2], tp);
        if (x2 == x) {
          if (y2 == y + 1) {
            if (c == 'L' || c == 'U' || c == 'D' || c == '+' || c == '-' ||
                c == '>')
              if (c2 == 'R' || c2 == 'U' || c2 == 'D' || c2 == '+' ||
                  c2 == '-' || c2 == '<') {
                if (di2[x2][y2][tp] > dis + 1)
                  pq.push({{-dis - 1, tp}, {x2, y2}}),
                      di2[x2][y2][tp] = dis + 1;
              }
          } else {
            if (c == 'R' || c == 'U' || c == 'D' || c == '+' || c == '-' ||
                c == '<')
              if (c2 == 'L' || c2 == 'U' || c2 == 'D' || c2 == '+' ||
                  c2 == '-' || c2 == '>') {
                if (di2[x2][y2][tp] > dis + 1)
                  pq.push({{-dis - 1, tp}, {x2, y2}}),
                      di2[x2][y2][tp] = dis + 1;
              }
          }
        } else {
          if (x2 == x + 1) {
            if (c == 'L' || c == 'U' || c == 'R' || c == '+' || c == '|' ||
                c == 'v')
              if (c2 == 'L' || c2 == 'R' || c2 == 'D' || c2 == '+' ||
                  c2 == '|' || c2 == '^')
                if (di2[x2][y2][tp] > dis + 1)
                  pq.push({{-dis - 1, tp}, {x2, y2}}),
                      di2[x2][y2][tp] = dis + 1;
          } else {
            if (c == 'L' || c == 'D' || c == 'R' || c == '+' || c == '|' ||
                c == '^')
              if (c2 == 'L' || c2 == 'R' || c2 == 'U' || c2 == '+' ||
                  c2 == '|' || c2 == 'v')
                if (di2[x2][y2][tp] > dis + 1)
                  pq.push({{-dis - 1, tp}, {x2, y2}}),
                      di2[x2][y2][tp] = dis + 1;
          }
        }
      }
      for (long long i = 1; i <= 1; i++) {
        if (di2[x][y][(tp + i) % 4] > dis + i)
          pq.push({{-dis - 1, (i + tp) % 4}, {x, y}}),
              di2[x][y][(tp + i) % 4] = dis + i;
      }
    }
  }
  if (di[x2][y2] >= 1e9) {
    cout << -1 << "\n";
    return 0;
  }
  cout << di[x2][y2] << "\n";
}
