#include <bits/stdc++.h>
using namespace std;
const long double PI = 3.1415926535897932384626433832795;
const long double EPS = 1e-11;
int n, m;
string s[1010];
char C[1010][1010][4];
int d[1010][1010][4];
pair<int, int> S, E;
set<pair<pair<int, int>, pair<int, int> > > st;
pair<pair<int, int>, pair<int, int> > v;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
char tra(pair<int, int> v, int k) {
  if (k == 0) return s[v.first][v.second];
  if (k == 1) {
    if (s[v.first][v.second] == '+') return '+';
    if (s[v.first][v.second] == '-') return '|';
    if (s[v.first][v.second] == '|') return '-';
    if (s[v.first][v.second] == '^') return '>';
    if (s[v.first][v.second] == '>') return 'v';
    if (s[v.first][v.second] == 'v') return '<';
    if (s[v.first][v.second] == '<') return '^';
    if (s[v.first][v.second] == 'L') return 'U';
    if (s[v.first][v.second] == 'U') return 'R';
    if (s[v.first][v.second] == 'R') return 'D';
    if (s[v.first][v.second] == 'D') return 'L';
  }
  if (k == 2) {
    if (s[v.first][v.second] == '+') return '+';
    if (s[v.first][v.second] == '-') return '-';
    if (s[v.first][v.second] == '|') return '|';
    if (s[v.first][v.second] == '^') return 'v';
    if (s[v.first][v.second] == '>') return '<';
    if (s[v.first][v.second] == 'v') return '^';
    if (s[v.first][v.second] == '<') return '>';
    if (s[v.first][v.second] == 'L') return 'R';
    if (s[v.first][v.second] == 'U') return 'D';
    if (s[v.first][v.second] == 'R') return 'L';
    if (s[v.first][v.second] == 'D') return 'U';
  }
  if (k == 3) {
    if (s[v.first][v.second] == '+') return '+';
    if (s[v.first][v.second] == '-') return '|';
    if (s[v.first][v.second] == '|') return '-';
    if (s[v.first][v.second] == '^') return '<';
    if (s[v.first][v.second] == '>') return '^';
    if (s[v.first][v.second] == 'v') return '>';
    if (s[v.first][v.second] == '<') return 'v';
    if (s[v.first][v.second] == 'L') return 'D';
    if (s[v.first][v.second] == 'U') return 'L';
    if (s[v.first][v.second] == 'R') return 'U';
    if (s[v.first][v.second] == 'D') return 'R';
  }
}
bool step(pair<int, int> v, int k, int i) {
  char c1 = C[v.first][v.second][k % 4];
  char c2 = C[v.first + dx[i]][v.second + dy[i]][k % 4];
  if (i == 0) {
    if ((c1 == '+' || c1 == '|' || c1 == '^' || c1 == 'L' || c1 == 'R' ||
         c1 == 'D') &&
        (c2 == '+' || c2 == '|' || c2 == 'v' || c2 == 'L' || c2 == 'R' ||
         c2 == 'U'))
      return 1;
    return 0;
  }
  if (i == 1) {
    if ((c1 == '+' || c1 == '|' || c1 == 'v' || c1 == 'L' || c1 == 'R' ||
         c1 == 'U') &&
        (c2 == '+' || c2 == '|' || c2 == '^' || c2 == 'L' || c2 == 'R' ||
         c2 == 'D'))
      return 1;
    return 0;
  }
  if (i == 2) {
    if ((c1 == '+' || c1 == '-' || c1 == '<' || c1 == 'U' || c1 == 'R' ||
         c1 == 'D') &&
        (c2 == '+' || c2 == '-' || c2 == '>' || c2 == 'L' || c2 == 'U' ||
         c2 == 'D'))
      return 1;
    return 0;
  }
  if (i == 3) {
    if ((c1 == '+' || c1 == '-' || c1 == '>' || c1 == 'L' || c1 == 'U' ||
         c1 == 'D') &&
        (c2 == '+' || c2 == '-' || c2 == '<' || c2 == 'U' || c2 == 'R' ||
         c2 == 'D'))
      return 1;
    return 0;
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < (n); i++) cin >> s[i];
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++)
      for (int k = 0; k < (4); k++) C[i][j][k] = tra(make_pair(i, j), k);
  cin >> S.first >> S.second >> E.first >> E.second;
  S.first--, S.second--, E.first--, E.second--;
  st.insert(make_pair(make_pair(0, 0), S));
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (m); j++)
      for (int k = 0; k < (4); k++) d[i][j][k] = 999999999;
  for (int i = 0; i < (4); i++) {
    d[S.first][S.second][i] = i;
    st.insert(make_pair(make_pair(i, i), S));
  }
  pair<int, int> nv, V;
  int krot, kstep;
  while (!st.empty()) {
    v = (*st.begin());
    V = v.second;
    kstep = v.first.first;
    krot = v.first.second;
    st.erase(st.begin());
    for (int i = 0; i < (4); i++) {
      nv = v.second;
      nv.first += dx[i];
      nv.second += dy[i];
      if (nv.first < 0 || nv.first >= n || nv.second < 0 || nv.second >= m)
        continue;
      for (int rot = 0; rot < (4); rot++) {
        int KR = (krot + rot) % 4;
        if (step(V, KR, i) &&
            d[nv.first][nv.second][KR] > d[V.first][V.second][krot] + rot + 1) {
          d[nv.first][nv.second][KR] = d[V.first][V.second][krot] + rot + 1;
          st.insert(make_pair(make_pair(d[nv.first][nv.second][KR], KR), nv));
        }
      }
    }
  }
  int res = 999999999;
  for (int k = 0; k < (4); k++) res = min(res, d[E.first][E.second][k]);
  if (res == 999999999) res = -1;
  cout << res;
  return 0;
}
