from heapq import heappush, heappop inf = float('inf') def dijkstra(s, g, G): # ゴールがない場合はg=-1とする。 N = len(G) def cost(v, m): return v * N + m dist = [inf] * N mindist = [inf] * N seen = [False] * N Q = [cost(0, s)] while Q: c, m = divmod(heappop(Q), N) if seen[m]: continue seen[m] = True dist[m] = c if m == g: return dist #------heapをアップデートする。-------- for u, C in G[m]: if seen[u]: continue newdist = dist[m] + C #------------------------------------ if newdist >= mindist[u]: continue mindist[u] = newdist heappush(Q, cost(newdist, u)) return dist H, W = map(int, input().split()) N = H * W G = [[] for i in range(N)] S = [] for i in range(H): S.append(list(input())) v = 10**9 def f(a, b): return a * W + b for i in range(H): for j in range(W - 1): if S[i][j] == S[i][j + 1] == ".": G[f(i,j)].append((f(i,j+1), v)) G[f(i,j+1)].append((f(i,j), v)) for j in range(W): for i in range(H - 1): if S[i][j] == S[i + 1][j] == ".": G[f(i,j)].append((f(i+1,j), 1)) G[f(i+1,j)].append((f(i,j), 1)) D = dijkstra(0, N - 1, G) if D[-1] == inf: print("No") else: print("Yes") print(D[-1]//v, D[-1]%v)