#include <bits/stdc++.h>
using namespace std;
int di[] = {-1, 0, +1, 0};
int dj[] = {0, +1, 0, -1};
map<char, vector<int> > jump = {make_pair('+', vector<int>({0, 1, 2, 3})),
                                make_pair('-', vector<int>({1, 3})),
                                make_pair('|', vector<int>({0, 2})),
                                make_pair('<', vector<int>({3})),
                                make_pair('>', vector<int>({1})),
                                make_pair('^', vector<int>({0})),
                                make_pair('v', vector<int>({2})),
                                make_pair('U', vector<int>({1, 2, 3})),
                                make_pair('R', vector<int>({0, 2, 3})),
                                make_pair('D', vector<int>({0, 1, 3})),
                                make_pair('L', vector<int>({0, 1, 2})),
                                make_pair('*', vector<int>())};
tuple<int, int, int> Q[4000006];
vector<string> B;
bool can(int x1, int y1, int x2, int y2, int d) {
  vector<int> v = jump[B[x1][y1]];
  for (auto t : (v)) {
    int dx = di[(t + d) % 4], dy = dj[(t + d) % 4];
    int first = x1 + dx;
    int second = y1 + dy;
    if (first == x2 && second == y2) {
      return true;
    }
  }
  return false;
}
int D[1005][1005][4];
int bfs(int a, int b, int p, int q) {
  memset(D, -1, sizeof(D));
  D[a][b][0] = 0;
  int fr = 0, bk = 0;
  Q[bk++] = make_tuple(a, b, 0);
  while (fr < bk) {
    int i, j, d;
    tie(i, j, d) = Q[fr++];
    vector<int> v = jump[B[i][j]];
    for (auto t : (v)) {
      int dx = di[(t + d) % 4], dy = dj[(t + d) % 4];
      int first = i + dx;
      int second = j + dy;
      if (0 <= first && first < int((B).size()) && 0 <= second &&
          second < int((B.back()).size())) {
        if (can(first, second, i, j, d) && D[first][second][d] == -1) {
          D[first][second][d] = D[i][j][d] + 1;
          Q[bk++] = make_tuple(first, second, d);
        }
      }
    }
    for (int t = (1); t < int(2); t++) {
      int td = (d + t) % 4;
      if (D[i][j][td] == -1) {
        D[i][j][td] = D[i][j][d] + 1;
        Q[bk++] = make_tuple(i, j, td);
      }
    }
  }
  int ans = -1;
  for (int i = 0; i < int(4); i++) {
    if (D[p][q][i] != -1) {
      if (ans == -1) {
        ans = D[p][q][i];
      } else {
        ans = min(ans, D[p][q][i]);
      }
    }
  }
  return ans;
}
int main() {
  std::ios_base::sync_with_stdio(false);
  int n, m;
  cin >> m >> n;
  B.resize(m);
  for (int i = 0; i < int(m); i++) {
    cin >> B[i];
  }
  int a, b, p, q;
  cin >> a >> b >> p >> q;
  cout << bfs(a - 1, b - 1, p - 1, q - 1);
  return 0;
}
