#3RE
#include <iostream>
using namespace std;
string s[30], anchor="right";
bool v[30][30][16]={0};
int r,c,reg=0;
int dfs(int x,int y){
cout << x << " " << y << " " << reg << " " << anchor << endl;
if (s[x][y]=='@'){
return 0;
}
if (v[x][y][reg]){
return 1;
}
v[x][y][reg]=1;
switch (s[x][y]){
case '<':
anchor="left";
break;
case '>':
anchor="right";
break;
case '^':
anchor="up";
break;
case 'v':
anchor="down";
break;
case '_':
if (reg==0){
anchor="right";
}else{
anchor="left";
}
break;
case '|':
if (reg==0){
anchor="down";
}else{
anchor="up";
}
break;
case '?':
anchor="all";
break;
case '+':
reg+=1;
if (reg>15)reg=0;
break;
case '-':
reg-=1;
if (reg<0)reg=15;
break;
default:
if (s[x][y]>='0'&&s[x][y]<='9'){
reg=s[x][y]-'0';
}
}
if (anchor=="left"){
if (y>0)
return dfs(x,y-1);
} else if (anchor=="right"){
if (y+1==c&&x+1<r){
return dfs(x+1,0);
} else if (y<c-1){
return dfs(x,y+1);
}
} else if (anchor=="up"){
if (x>0)
return dfs(x-1,y);
} else if (anchor=="down"){
if (x<r-1)
return dfs(x+1,y);
} else{
if(x>0&&!dfs(x-1,y))return 0;
if(x<r-1&&!dfs(x+1,y)) return 0;
if(y>0&&!dfs(x,y-1))return 0;
if(y<c-1&&!dfs(x,y+1)) return 0;
}
}
int main(){
cin >> r >> c;
for (int i=0;i<r;i++){
cin >> s[i];
}
if (dfs(0,0))cout << "NO" <<endl;
else cout << "YES" << endl;
return 0;
}