#include <bits/stdc++.h>
using namespace std;
ifstream in("in.txt");
char door[4][4] = {{'+', '+', '+', '+'},
                   {'-', '|', '-', '|'},
                   {'^', '>', 'v', '<'},
                   {'L', 'U', 'R', 'D'}};
int n, m;
bool used[1001][1001][4];
char mp[1001][1001];
int type(char c) {
  if (c == '+')
    return 0;
  else if (c == '-' || c == '|')
    return 1;
  else if (c == '^' || c == 'v' || c == '<' || c == '>')
    return 2;
  else
    return 3;
}
char turn(int c, int n) {
  int i = type(c);
  int pos;
  for (pos = 0; pos < 4; pos++)
    if (door[i][pos] == c) break;
  return door[i][(pos + n) % 4];
}
bool can(char c, int d) {
  if (d == 1) {
    if (c == '+') return 1;
    if (c == '-') return 1;
    if (c == '<') return 1;
    if (c == 'U' || c == 'R' || c == 'D') return 1;
  } else if (d == 2) {
    if (c == '+') return 1;
    if (c == '|') return 1;
    if (c == '^') return 1;
    if (c == 'L' || c == 'R' || c == 'D') return 1;
  } else if (d == 3) {
    if (c == '+') return 1;
    if (c == '-') return 1;
    if (c == '>') return 1;
    if (c == 'L' || c == 'U' || c == 'D') return 1;
  } else if (d == 4) {
    if (c == '+') return 1;
    if (c == '|') return 1;
    if (c == 'v') return 1;
    if (c == 'L' || c == 'U' || c == 'R') return 1;
  }
  return 0;
}
bool valid(int x, int y, int t) {
  return x >= 1 && x <= n && y >= 1 && y <= m && !used[x][y][t] &&
         mp[x][y] != '*';
}
int bfs(int xs, int ys, int xf, int yf) {
  queue<pair<pair<int, int>, pair<int, int> > > q;
  q.push({{xs, ys}, {0, 0}});
  used[xs][ys][0] = 1;
  while (!q.empty()) {
    int x = q.front().first.first;
    int y = q.front().first.second;
    int t = q.front().second.first % 4;
    int d = q.front().second.second;
    if (x == xf && y == yf) return d;
    q.pop();
    if (valid(x, y - 1, t) && can(turn(mp[x][y], t), 1) &&
        can(turn(mp[x][y - 1], t), 3)) {
      used[x][y - 1][t] = 1;
      q.push({{x, y - 1}, {t, d + 1}});
    }
    if (valid(x, y + 1, t) && can(turn(mp[x][y], t), 3) &&
        can(turn(mp[x][y + 1], t), 1)) {
      used[x][y + 1][t] = 1;
      q.push({{x, y + 1}, {t, d + 1}});
    }
    if (valid(x - 1, y, t) && can(turn(mp[x][y], t), 2) &&
        can(turn(mp[x - 1][y], t), 4)) {
      used[x - 1][y][t] = 1;
      q.push({{x - 1, y}, {t, d + 1}});
    }
    if (valid(x + 1, y, t) && can(turn(mp[x][y], t), 4) &&
        can(turn(mp[x + 1][y], t), 2)) {
      used[x + 1][y][t] = 1;
      q.push({{x + 1, y}, {t, d + 1}});
    }
    if (valid(x, y, (t + 1) % 4)) {
      used[x][y][(t + 1) % 4] = 1;
      q.push({{x, y}, {(t + 1) % 4, d + 1}});
    }
  }
  return -1;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> mp[i][j];
      used[i][j][0] = used[i][j][1] = used[i][j][2] = used[i][j][3] = 0;
    }
  }
  int xs, ys, xf, yf;
  cin >> xs >> ys >> xf >> yf;
  cout << bfs(xs, ys, xf, yf);
  return 0;
}
