#include <bits/stdc++.h>
const double EPS = 0.00000001;
const long long mod = 1000000000 + 7;
using namespace std;
char rot(int i, char c) {
  if (c == '+') {
    return '+';
  } else if (c == '-') {
    if (i % 2) return '|';
    return c;
  } else if (c == '|') {
    if (i % 2) return '-';
    return c;
  } else if (c == '^') {
    if (i == 0)
      return c;
    else if (i == 1)
      return '>';
    else if (i == 2)
      return 'v';
    else
      return '<';
  } else if (c == '>') {
    if (i == 0)
      return c;
    else if (i == 1)
      return 'v';
    else if (i == 2)
      return '<';
    return '^';
  } else if (c == '<') {
    if (i == 0)
      return c;
    else if (i == 1)
      return '^';
    else if (i == 2)
      return '>';
    else
      return 'v';
  } else if (c == 'v') {
    if (i == 0)
      return c;
    else if (i == 1)
      return '<';
    else if (i == 2)
      return '^';
    else
      return '>';
  } else if (c == 'L') {
    if (i == 0)
      return c;
    else if (i == 1)
      return 'U';
    else if (i == 2)
      return 'R';
    else
      return 'D';
  } else if (c == 'R') {
    if (i == 0)
      return c;
    else if (i == 1)
      return 'D';
    else if (i == 2)
      return 'L';
    else
      return 'U';
  } else if (c == 'U') {
    if (i == 0)
      return c;
    else if (i == 1)
      return 'R';
    else if (i == 2)
      return 'D';
    else
      return 'L';
  } else if (c == 'D') {
    if (i == 0)
      return c;
    else if (i == 1)
      return 'L';
    else if (i == 2)
      return 'U';
    else
      return 'R';
  }
}
int vis[1011][1011][4], d[1001][1001][4];
char a[1011][1011];
string R = "-+>DUL";
string L = "-+<DUR";
string D = "|+vURL";
string U = "|+^DRL";
int hasR(int i, int j, int v) {
  char c = rot(v, a[i][j]);
  for (auto x : R) {
    if (x == c) return 1;
  }
  return 0;
}
int hasL(int i, int j, int v) {
  char c = rot(v, a[i][j]);
  for (auto x : L) {
    if (x == c) return 1;
  }
  return 0;
}
int hasU(int i, int j, int v) {
  char c = rot(v, a[i][j]);
  for (auto x : U) {
    if (x == c) return 1;
  }
  return 0;
}
int hasD(int i, int j, int v) {
  char c = rot(v, a[i][j]);
  for (auto x : D) {
    if (x == c) return 1;
  }
  return 0;
}
int r, c;
void f(int y, int x, int ver) {
  vis[y][x][ver] = 1;
  queue<vector<int>> q;
  q.push({y, x, ver});
  while (!q.empty()) {
    auto u = q.front();
    q.pop();
    int i = u[0], j = u[1], v = u[2], dd = d[i][j][v];
    if (!vis[i][j - 1][v]) {
      if (hasL(i, j, v) && hasR(i, j - 1, v)) {
        q.push({i, j - 1, v});
        vis[i][j - 1][v] = 1;
        d[i][j - 1][v] = dd + 1;
        if (i == r && (j - 1) == c) return;
      }
    }
    if (!vis[i][j + 1][v]) {
      if (hasR(i, j, v) && hasL(i, j + 1, v)) {
        q.push({i, j + 1, v});
        vis[i][j + 1][v] = 1;
        d[i][j + 1][v] = dd + 1;
        if (i == r && (j + 1) == c) return;
      }
    }
    if (!vis[i - 1][j][v]) {
      if (hasU(i, j, v) && hasD(i - 1, j, v)) {
        q.push({i - 1, j, v});
        vis[i - 1][j][v] = 1;
        d[i - 1][j][v] = dd + 1;
        if ((i - 1) == r && j == c) return;
      }
    }
    if (!vis[i + 1][j][v]) {
      if (hasD(i, j, v) && hasU(i + 1, j, v)) {
        q.push({i + 1, j, v});
        d[i + 1][j][v] = dd + 1;
        vis[i + 1][j][v] = 1;
        if ((i + 1) == r && j == c) return;
      }
    }
    if (!vis[i][j][(v + 1) % 4]) {
      int w = (v + 1) % 4;
      q.push({i, j, w});
      d[i][j][w] = dd + 1;
      vis[i][j][w] = 1;
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n + 5; i++) {
    for (int j = 0; j < m + 5; j++) a[i][j] = '*';
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cin >> a[i][j];
  int y, x;
  cin >> y >> x >> r >> c;
  if (y == r && x == c) {
    cout << 0 << endl;
  } else {
    f(y, x, 0);
    int fnd = 0;
    for (int i = 0; i < 4; i++) {
      if (vis[r][c][i]) fnd = 1;
    }
    if (!fnd)
      cout << -1 << endl;
    else {
      long long ans = 1000000000000LL;
      for (int i = 0; i < 4; i++) {
        if (vis[r][c][i]) ans = d[r][c][i];
      }
      cout << ans << endl;
    }
  }
  int ______________;
  cin >> ______________;
  return 0;
}
