import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
class guanzi{
int x;
int y;
}//用来记录经过点的坐标
public class 水管工游戏 {
static int[][] a=new int[15][15];
static boolean[][] book=new boolean[15][15];
static Stack<guanzi> s=new Stack<>();//记录路径
static int n,m;
static int flag=0;
static void dfs(int x,int y,int front){
if(x==n-1&&y==m){//这里的y值要注意,要超出图边界,水管要出水,出图
flag=1;
while(!s.isEmpty()){
System.out.println("("+s.peek().x+" "+s.peek().y+")");//输出路径,反向,可以再搞个数组反向存储一下
s.pop();
}
return;
}
if(x<0||x>=n||y<0||y>=m) return;//超过图边界return
if(book[x][y]==true) return;//标记过return
book[x][y]=true;//标记
guanzi g=new guanzi();
g.x=x;
g.y=y;
s.push(g);//把经过的点放入路径栈
//水管口 左1 上2 右3 下4
if(a[x][y]>=5&&a[x][y]<=6){//直的水管两种放置方式横放竖放
if(front==1)//水管口在左边
dfs(x,y+1,1);//横放向右移动水管口在左边1
if(front==2)//水管口在上边
dfs(x+1,y,2);//向下移动水管口在上边
if(front==3)//水管口在右边
dfs(x,y-1,3);//水管口在右边
if(front==4)//水管口在下边
dfs(x-1,y,4); //水管口在下边
}
if(a[x][y]>=1&&a[x][y]<=4){//弯的水管
if(front==1){//类似 特别要注意一下下一次的水管口的位置
dfs(x+1,y,2);
dfs(x-1,y,4);
}
if(front==2){
dfs(x,y+1,1);
dfs(x,y-1,3);
}
if(front==3){
dfs(x+1,y,2);
dfs(x-1,y,4);
}
if(front==4){
dfs(x,y+1,1);
dfs(x,y-1,3);
}
}
book[x][y]=false;
if(!s.empty()) s.pop();
return;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
for(int i=0;i<15;i++){
Arrays.fill(a[i],0);
Arrays.fill(book[i],false);
}
n=sc.nextInt();
m=sc.nextInt();
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i][j]=sc.nextInt();
dfs(0,0,1);
if(flag==0)
System.out.println("NO");
else
System.out.println("YES");
}
}