#include <bits/stdc++.h>
using namespace std;
const int maxn = 1008;
const int INF = 0x7f7f7f7f;
struct fuck {
  char mp[maxn][maxn];
} f[4];
int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
int n, m;
void fuckbitch(int i, int j, int x) {
  if (f[x].mp[i][j] == '^')
    f[x + 1].mp[i][j] = '>';
  else if (f[x].mp[i][j] == '>')
    f[x + 1].mp[i][j] = 'v';
  else if (f[x].mp[i][j] == 'v')
    f[x + 1].mp[i][j] = '<';
  else if (f[x].mp[i][j] == '<')
    f[x + 1].mp[i][j] = '^';
  else if (f[x].mp[i][j] == '-')
    f[x + 1].mp[i][j] = '|';
  else if (f[x].mp[i][j] == '|')
    f[x + 1].mp[i][j] = '-';
  else if (f[x].mp[i][j] == '+')
    f[x + 1].mp[i][j] = '+';
  else if (f[x].mp[i][j] == '*')
    f[x + 1].mp[i][j] = '*';
  else if (f[x].mp[i][j] == 'U')
    f[x + 1].mp[i][j] = 'R';
  else if (f[x].mp[i][j] == 'R')
    f[x + 1].mp[i][j] = 'D';
  else if (f[x].mp[i][j] == 'D')
    f[x + 1].mp[i][j] = 'L';
  else if (f[x].mp[i][j] == 'L')
    f[x + 1].mp[i][j] = 'U';
}
void trans(int x) {
  int i, j;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) fuckbitch(i, j, x);
}
int x, y, sx, sy;
struct poi {
  int x, y, z, t;
};
bool vis[4][maxn][maxn];
bool judge(char a, char b, int dir) {
  if (dir == 0) {
    if (a == '+' || a == '^' || a == '|' || a == 'L' || a == 'R' || a == 'D') {
      if (b == '+' || b == 'v' || b == '|' || b == 'L' || b == 'R' || b == 'U')
        return true;
    }
  } else if (dir == 1) {
    if (a == '+' || a == '>' || a == '-' || a == 'U' || a == 'D' || a == 'L')
      if (b == '+' || b == '<' || b == '-' || b == 'R' || b == 'U' || b == 'D')
        return true;
  } else if (dir == 2) {
    if (a == '+' || a == 'v' || a == '|' || a == 'U' || a == 'L' || a == 'R')
      if (b == '+' || b == '^' || b == '|' || b == 'L' || b == 'R' || b == 'D')
        return true;
  } else if (dir == 3) {
    if (a == '+' || a == '<' || a == '-' || a == 'U' || a == 'D' || a == 'R')
      if (b == '+' || b == '>' || b == '-' || b == 'U' || b == 'D' || b == 'L')
        return true;
  }
  return false;
}
int bfs(int x, int y, int z) {
  poi g;
  g.x = x;
  g.y = y;
  g.z = z;
  g.t = 0;
  memset(vis, false, sizeof(vis));
  queue<poi> q;
  q.push(g);
  vis[z][x][y] = true;
  int nx, ny, nz, nt, i, k, t;
  while (!q.empty()) {
    g = q.front();
    q.pop();
    x = g.x;
    y = g.y;
    z = g.z;
    t = g.t;
    if (x == sx && y == sy) return t;
    for (i = 0; i < 4; i++) {
      nx = x + dir[i][0];
      ny = y + dir[i][1];
      if (!vis[z][nx][ny] && judge(f[z].mp[x][y], f[z].mp[nx][ny], i)) {
        vis[z][nx][ny] = true;
        g.x = nx;
        g.y = ny;
        g.z = z;
        g.t = t + 1;
        q.push(g);
      }
    }
    if (!vis[(z + 1) % 4][x][y]) {
      g.x = x;
      g.y = y;
      g.z = (z + 1) % 4;
      g.t = t + 1;
      vis[(z + 1) % 4][x][y] = true;
      q.push(g);
    }
  }
  return -1;
}
int main() {
  int i, j, k;
  while (scanf("%d%d", &n, &m) == 2) {
    memset(f, '*', sizeof(f));
    for (i = 1; i <= n; i++) scanf("%s", f[0].mp[i] + 1);
    scanf("%d%d%d%d", &x, &y, &sx, &sy);
    trans(0);
    trans(1);
    trans(2);
    int ans = bfs(x, y, 0);
    if (ans == INF)
      printf("-1\n");
    else
      printf("%d\n", ans);
  }
  return 0;
}
