#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;bool ans=0;
int dy[]={0,-1,1,0,0},dx[]={0,0,0,-1,1};
bool vis[50][50][50][50];
char a[50][50];
bool dfs(int x,int y,int k,int f){
x=(x+n)%n;y=(y+m)%m;
if(vis[x][y][k][f]) return;
vis[x][y][k][f]=1;
switch(a[x][y]){
case '<':{f=1;break;}
case '>':{f=2;break;}
case '^':{f=3;break;}
case 'v':{f=4;break;}
case '\':{if(k==0)f=2;else f=1;break;}
case '|':{if(k==0)f=4;else f=3;break;}
case '?':{for(int i=1;i<=4;i++)if(dfs(x+dx[i],y+dy[i],k,i)) return 1;}
case '.':break;
case '@':{return 1;break;}
case '+':{k=(k+1)%16;break;}
case '-':{k=(k+15)%16;break;}
default:{k=a[x][y]-'0';break;}
}
if(dfs(x+dy[f],y+dy[f],k,f)) return 1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%c",&a[i][j]);
ans=dfs(1,1,0,1);
cout<<ans==1?"YES":"NO";
return 0;
}