#include <bits/stdc++.h>
using namespace std;
long long n, m;
char massiv[2010][2010];
char nuj[2010][2010][6];
long long dp[2010][2010][5];
long long sx, sy;
long long tx, ty;
long long check(long long x, long long y, long long povorot, long long kuda) {
  if (x >= 1 && x <= n && y >= 1 && y <= m && nuj[x][y][povorot] != '*') {
    if (kuda == 1) {
      if (nuj[x][y][povorot] == '+' || nuj[x][y][povorot] == '|' ||
          nuj[x][y][povorot] == '^' || nuj[x][y][povorot] == 'D' ||
          nuj[x][y][povorot] == 'L' || nuj[x][y][povorot] == 'R')
        return 1;
      else
        return 0;
    } else if (kuda == 2) {
      if (nuj[x][y][povorot] == '+' || nuj[x][y][povorot] == '|' ||
          nuj[x][y][povorot] == 'v' || nuj[x][y][povorot] == 'U' ||
          nuj[x][y][povorot] == 'L' || nuj[x][y][povorot] == 'R')
        return 1;
      else
        return 0;
    } else if (kuda == 3) {
      if (nuj[x][y][povorot] == '+' || nuj[x][y][povorot] == '-' ||
          nuj[x][y][povorot] == '<' || nuj[x][y][povorot] == 'D' ||
          nuj[x][y][povorot] == 'U' || nuj[x][y][povorot] == 'R')
        return 1;
      else
        return 0;
    } else if (kuda == 4) {
      if (nuj[x][y][povorot] == '+' || nuj[x][y][povorot] == '-' ||
          nuj[x][y][povorot] == '>' || nuj[x][y][povorot] == 'D' ||
          nuj[x][y][povorot] == 'L' || nuj[x][y][povorot] == 'U')
        return 1;
      else
        return 0;
    }
  } else
    return 0;
}
priority_queue<
    pair<long long, pair<long long, pair<long long, long long> > >,
    vector<pair<long long, pair<long long, pair<long long, long long> > > >,
    greater<pair<long long, pair<long long, pair<long long, long long> > > > >
    q;
char elem[15] = {'-', '|', '-', '>', 'v', '<', '^',
                 '>', 'L', 'U', 'R', 'D', 'L'};
void djikstra(long long sx, long long sy) {
  dp[sx][sy][0] = 0;
  q.push(make_pair(0, make_pair(0, make_pair(sx, sy))));
  while (!q.empty()) {
    auto from = q.top();
    q.pop();
    if (dp[from.second.second.first][from.second.second.second]
          [from.second.first] < from.first)
      continue;
    long long fromx = from.second.second.first;
    long long fromy = from.second.second.second;
    long long povorot = from.second.first;
    if (check(fromx, fromy, povorot, 1) &&
        check(fromx - 1, fromy, povorot, 2) &&
        dp[fromx - 1][fromy][povorot] > dp[fromx][fromy][povorot] + 1) {
      dp[fromx - 1][fromy][povorot] = dp[fromx][fromy][povorot] + 1;
      q.push(make_pair(dp[fromx - 1][fromy][povorot],
                       make_pair(povorot, make_pair(fromx - 1, fromy))));
    }
    if (check(fromx, fromy, povorot, 2) &&
        check(fromx + 1, fromy, povorot, 1) &&
        dp[fromx + 1][fromy][povorot] > dp[fromx][fromy][povorot] + 1) {
      dp[fromx + 1][fromy][povorot] = dp[fromx][fromy][povorot] + 1;
      q.push(make_pair(dp[fromx + 1][fromy][povorot],
                       make_pair(povorot, make_pair(fromx + 1, fromy))));
    }
    if (check(fromx, fromy, povorot, 3) &&
        check(fromx, fromy - 1, povorot, 4) &&
        dp[fromx][fromy - 1][povorot] > dp[fromx][fromy][povorot] + 1) {
      dp[fromx][fromy - 1][povorot] = dp[fromx][fromy][povorot] + 1;
      q.push(make_pair(dp[fromx][fromy - 1][povorot],
                       make_pair(povorot, make_pair(fromx, fromy - 1))));
    }
    if (check(fromx, fromy, povorot, 4) &&
        check(fromx, fromy + 1, povorot, 3) &&
        dp[fromx][fromy + 1][povorot] > dp[fromx][fromy][povorot] + 1) {
      dp[fromx][fromy + 1][povorot] = dp[fromx][fromy][povorot] + 1;
      q.push(make_pair(dp[fromx][fromy + 1][povorot],
                       make_pair(povorot, make_pair(fromx, fromy + 1))));
    }
    if (dp[fromx][fromy][povorot] + 1 < dp[fromx][fromy][(povorot + 1) % 4]) {
      dp[fromx][fromy][(povorot + 1) % 4] = dp[fromx][fromy][povorot] + 1;
      q.push(make_pair(dp[fromx][fromy][(povorot + 1) % 4],
                       make_pair((povorot + 1) % 4, make_pair(fromx, fromy))));
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  ;
  cin >> n >> m;
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= m; j++) {
      cin >> massiv[i][j];
      nuj[i][j][0] = massiv[i][j];
      for (long long times = 0; times < 4; times++) dp[i][j][times] = INT_MAX;
    }
  }
  cin >> sx >> sy;
  cin >> tx >> ty;
  for (long long times = 1; times < 4; times++) {
    for (long long i = 1; i <= n; i++) {
      for (long long j = 1; j <= m; j++) {
        if (nuj[i][j][times - 1] == '+') {
          nuj[i][j][times] = '+';
          continue;
        } else if (nuj[i][j][times - 1] == '*') {
          nuj[i][j][times] = '*';
          continue;
        }
        for (long long ii = 0; ii < 13; ii++) {
          if (nuj[i][j][times - 1] == elem[ii]) {
            nuj[i][j][times] = elem[ii + 1];
            break;
          }
        }
      }
    }
  }
  djikstra(sx, sy);
  long long minn = INT_MAX;
  for (long long i = 0; i < 4; i++) {
    minn = min(minn, dp[tx][ty][i]);
  }
  if (minn == INT_MAX)
    cout << -1 << "\n";
  else
    cout << minn << "\n";
  return 0;
}
