#include<bits/stdc++.h>
#define rep(i,a,...) for(int i = (a)*(strlen(#__VA_ARGS__)!=0);i<(int)(strlen(#__VA_ARGS__)?__VA_ARGS__:(a));++i)
#define per(i,a,...) for(int i = (strlen(#__VA_ARGS__)?__VA_ARGS__:(a))-1;i>=(int)(strlen(#__VA_ARGS__)?(a):0);--i)
#define foreach(i, n) for(auto &i:(n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
using ll = long long;
//const ll MOD = (ll)1e9+7;
const ll MOD = 998244353;
const int INF = (ll)1e9+7;
const ll INFLL = (ll)1e18;
using namespace std;
template<class t>
using vvector = vector<vector<t>>;
template<class t>
using vvvector = vector<vector<vector<t>>>;
template<class t>
using priority_queuer = priority_queue<t, vector<t>, greater<t>>;
template<class t, class u> bool chmax(t &a, u b){if(a<b){a=b;return true;}return false;}
template<class t, class u> bool chmin(t &a, u b){if(a>b){a=b;return true;}return false;}
#ifdef DEBUG
#define debug(x) cout<<"LINE "<<__LINE__<<": "<<#x<<" = "<<x<<endl;
#else
#define debug(x) (void)0
#endif

ll modpow(ll x, ll b){
  ll res = 1;
  while(b){
    if(b&1)res = res * x % MOD;
    x = x * x % MOD;
    b>>=1;
  }
  return res;
}

ll modinv(ll x){
  return modpow(x, MOD-2);
}

bool was_output = false;
template<class t>
void output(t a){
  if(was_output)cout << " ";
  cout << a;
  was_output = true;
}
void outendl(){
  was_output = false;
  cout << endl;
}
ll in(){
  ll res;
  scanf("%lld", &res);
  return res;
}

template<class t>
istream& operator>>(istream&is, vector<t>&x){
  for(auto &i:x)is >> i;
  return is;
}

template<class t, class u>
istream& operator>>(istream&is, pair<t, u>&x){
  is >> x.first >> x.second;
  return is;
}

template<class t>
void in(t&x){
  cin >> x;
}

int h;
int w;
vvector<int> tile;

vvector<set<vector<int>>> dp;

void input(){
  h = in();
  w = in();
  tile.resize(h,vector<int>(w,-1));
  foreach(i,tile){
    foreach(j,i){
      char d;
      in(d);
      if(d!='#'){
        j = d-'0';
      }
    }
  }
  dp.resize(h,vector<set<vector<int>>>(w));
}


bool func(int y,int x,vector<int> dice){
  if(y==h-1&&x==w-1)return true;
  if(dp[y][x].count(dice))return false;
  dp[y][x].insert(dice);
  auto isin = [&](int y,int x){
                return y<h && x<w && 0<=y&&0<=x;
              };
  auto right = [](vector<int> dice){
                 swap(dice[0],dice[2]);
                 swap(dice[3],dice[0]);
                 swap(dice[5],dice[3]);
                 return dice;
               };
  auto down = [](vector<int> dice){
                swap(dice[0],dice[1]);
                swap(dice[4],dice[0]);
                swap(dice[5],dice[4]);
                return dice;
              };
  auto left = [&](vector<int> dice){
              return right(right(right(dice)));
            };
  auto up = [&](vector<int> dice){
              return down(down(down(dice)));
            };
  vector<int> nd = right(dice);
  if(isin(y,x+1)&&tile[y][x+1]==nd[5]){
    if(func(y,x+1,nd))return true;
  }
  nd = down(dice);
  if(isin(y+1,x)&&tile[y+1][x]==nd[5]){
    if(func(y+1,x,nd))return true;
  }
  nd = left(dice);
  if(isin(y,x-1)&&tile[y][x-1]==nd[5]){
    if(func(y,x-1,nd))return true;
  }
  nd = up(dice);
  if(isin(y-1,x)&&tile[y-1][x]==nd[5]){
    if(func(y-1,x,nd))return true;
  }
  return false;
}

int main(){
  input();

  cout << (func(0,0,{1,2,3,4,5,6})?"YES":"NO") << endl;

  return 0;
}



Measured memory_bytes: 5504