#include #include using mint = atcoder::static_modint<998244353>; //using mint = atcoder::static_modint<1000000007>; using namespace std; using namespace atcoder; using ld = long double; using ll = long long; #define mp(a,b) make_pair(a,b) #define rep(i,s,n) for(int i=s; i dx{1,0,-1,0},dy{0,1,0,-1}; struct dijkstra{ public: dijkstra():_n(0){} dijkstra(int n):_n(n),G(n){} void add_edge(int from,int to,ll d){ G[from].push_back({to,d}); } vector start_from(int start){ vector dist(_n,-1); priority_queue,vector>,greater>> Q; Q.push({0,start}); dist[start]=0; while(!Q.empty()){ auto p=Q.top(); Q.pop(); int now=p.second; ll d=p.first; if(d!=dist[now])continue; for(auto e:G[now]){ int to=e.first; ll w=e.second; if(dist[to]==-1 || w+d>> G; }; int main(){ int h,w; cin >> h >> w; vector s(h); rep(i,0,h)cin >> s[i]; dijkstra G(h*w); rep(i,0,h)rep(j,0,w-1)if(s[i][j]==s[i][j+1]){ G.add_edge(i*w+j,i*w+j+1,1000000); G.add_edge(i*w+j+1,i*w+j,1000000); } rep(i,0,h-1)rep(j,0,w)if(s[i][j]==s[i+1][j]){ G.add_edge(i*w+j,(i+1)*w+j,1); G.add_edge((i+1)*w+j,i*w+j,1); } ll ans=G.start_from(0).back(); if(ans==-1)cout << "No"; else cout << "Yes\n" << ans/1000000 << " " << ans%1000000; }