#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#define LL long long
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N=15;
const int INF=0x3f3f3f3f;
//typedef pair<int,int>point;
int dist[N][N][N];
bool in[N][N][N];
int stx,sty,ndx,ndy;
struct node
{
int u[N],d[N],l[N],r[N];
}mem[N][N];
void init(int n,int m)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
mem[i][j].u[0]=4;
mem[i][j].d[0]=5;
mem[i][j].l[0]=3;
mem[i][j].r[0]=2;
mem[i][j].u[1]=5;
mem[i][j].d[1]=4;
mem[i][j].l[1]=2;
mem[i][j].r[1]=3;
mem[i][j].u[2]=2;
mem[i][j].d[2]=2;
mem[i][j].l[2]=0;
mem[i][j].r[2]=1;
mem[i][j].u[3]=3;
mem[i][j].d[3]=3;
mem[i][j].l[3]=1;
mem[i][j].r[3]=0;
mem[i][j].u[4]=1;
mem[i][j].d[4]=0;
mem[i][j].l[4]=4;
mem[i][j].r[4]=4;
mem[i][j].u[5]=0;
mem[i][j].d[5]=1;
mem[i][j].l[5]=5;
mem[i][j].r[5]=5;
}
cin>>stx>>sty;
cin>>ndx>>ndy;
char a,b,c;
while(cin>>a)
{
if(a=='v'||a=='h')
c=a;
else
{
cin>>b;
int x,y;
x=a-'0';
y=b-'0';
for(int i=0;i<6;++i)
{
if(c=='v')
{mem[x][y].d[i]=-1;mem[x+1][y].u[i]=-1;}
else
{mem[x][y].r[i]=-1;mem[x][y+1].l[i]=-1;}
}
}
}
}
void solve(int n,int m)
{
queue<int>qtx,qty,qtk;
memset(dist,-1,sizeof(dist));
dist[stx][sty][0]=0;
in[stx][sty][0]=true;
qtx.push(stx);
qty.push(sty);
qtk.push(0);
while(!qtx.empty())
{
int x=qtx.front();qtx.pop();
int y=qty.front();qty.pop();
int k=qtk.front();qtk.pop();
in[x][y][k]=false;
if(x-1>=1&&mem[x][y].u[k]!=-1)
{
int k1=mem[x][y].u[k];
if(dist[x-1][y][k1]==-1||dist[x-1][y][k1]>dist[x][y][k]+1)
{
dist[x-1][y][k1]=dist[x][y][k]+1;
if(in[x-1][y][k1]==false)
{
in[x-1][y][k1]=true;
qtx.push(x-1);qty.push(y);qtk.push(k1);
}
}
}
if(x+1<=n&&mem[x][y].d[k]!=-1)
{
int k1=mem[x][y].d[k];
if(dist[x+1][y][k1]==-1||dist[x+1][y][k1]>dist[x][y][k]+1)
{
dist[x+1][y][k1]=dist[x][y][k]+1;
if(in[x+1][y][k1]==false)
{
in[x+1][y][k1]=true;
qtx.push(x+1);qty.push(y);qtk.push(k1);
}
}
}
if(y-1>=1&&mem[x][y].l[k]!=-1)
{
int k1=mem[x][y].l[k];
if(dist[x][y-1][k1]==-1||dist[x][y-1][k1]>dist[x][y][k]+1)
{
dist[x][y-1][k1]=dist[x][y][k]+1;
if(in[x][y-1][k1]==false)
{
in[x][y-1][k1]=true;
qtx.push(x);qty.push(y-1);qtk.push(k1);
}
}
}
if(y+1<=m&&mem[x][y].r[k]!=-1)
{
int k1=mem[x][y].r[k];
if(dist[x][y+1][k1]==-1||dist[x][y+1][k1]>dist[x][y][k]+1)
{
dist[x][y+1][k1]=dist[x][y][k]+1;
if(in[x][y+1][k1]==false)
{
in[x][y+1][k1]=true;
qtx.push(x);qty.push(y+1);qtk.push(k1);
}
}
}
}
}
int main()
{
//freopen("data.in","r",stdin);
int n,m;
while(cin>>n>>m)
{
init(n,m);
solve(n,m);
if(dist[ndx][ndy][0]==-1)
cout<<"No solution"<<endl;
else
cout<<dist[ndx][ndy][0]<<endl;
}
}