#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {-1, +0, +1, +0};
const int dy[4] = {+0, +1, +0, -1};
vector<int> g[256];
vector<string> s(1000);
int dp[1000][1000][4], vis[1000][1000][4], n, m;
struct box {
  int val, x, y, d;
  bool operator<(const box& other) const { return val > other.val; }
};
int32_t main() {
  g['+'] = {1, 1, 1, 1};
  g['-'] = {0, 1, 0, 1};
  g['|'] = {1, 0, 1, 0};
  g['^'] = {1, 0, 0, 0};
  g['>'] = {0, 1, 0, 0};
  g['<'] = {0, 0, 0, 1};
  g['v'] = {0, 0, 1, 0};
  g['L'] = {1, 1, 1, 0};
  g['R'] = {1, 0, 1, 1};
  g['U'] = {0, 1, 1, 1};
  g['D'] = {1, 1, 0, 1};
  g['*'] = {0, 0, 0, 0};
  for (int i = 0; i < 1000; ++i)
    for (int j = 0; j < 1000; ++j)
      for (int k = 0; k < 4; ++k) dp[i][j][k] = 1e9;
  cin >> n >> m;
  for (int i = 0; i < n; ++i) cin >> s[i];
  int x[2], y[2];
  for (int k = 0; k < 2; ++k) cin >> x[k] >> y[k], --x[k], --y[k];
  priority_queue<box> pq;
  dp[x[0]][y[0]][0] = 0;
  pq.push({dp[x[0]][y[0]][0], x[0], y[0], 0});
  while (pq.size()) {
    box u = pq.top();
    pq.pop();
    if (vis[u.x][u.y][u.d]) continue;
    vis[u.x][u.y][u.d] = 1;
    for (int k = 0; k < 4; ++k) {
      int x = u.x + dx[k], y = u.y + dy[k];
      if (x >= 0 && x < n && y >= 0 && y < m) {
        for (int r = 0; r < 4; ++r) {
          int R = (u.d + r) % 4;
          if (g[1 * s[u.x][u.y]][(k - R + 4) % 4] &&
              g[1 * s[x][y]][(k - R + 2 + 4) % 4] &&
              dp[x][y][R] > dp[u.x][u.y][u.d] + r + 1)
            dp[x][y][R] = dp[u.x][u.y][u.d] + r + 1,
            pq.push({dp[x][y][R], x, y, R});
        }
      }
    }
  }
  int ans = 1e9;
  for (int k = 0; k < 4; ++k) ans = min(ans, dp[x[1]][y[1]][k]);
  cout << (ans < 1e9 ? ans : -1) << endl;
}
