#include using namespace std; typedef long long ll; typedef pair pii; #define fi first #define se second #define mp make_pair #define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N = 55; char a[N][N]; char b[N][N]; pii par[N][N]; int d[4][2] = {{-1,0},{+1,0},{0,-1},{0,+1}}; void dfs(pii e){ for(int i = 0 ;i < 4; i ++ ){ pii zz = mp(e.fi + d[i][0], e.se + d[i][1]); if(par[zz.fi][zz.se] == mp(-1,-1) && a[zz.fi][zz.se] != 'X'){ par[zz.fi][zz.se] = e; dfs(zz); } } } int tin[N][N]; int up[N][N]; int tt; vector lis; void dfs2(pii e, pii pi){ tin[e.fi][e.se]=tt; up[e.fi][e.se]=(int)1e9; // up < tin tt++; for(int i = 0 ; i < 4; i ++ ){ pii zz = mp(e.fi + d[i][0], e.se + d[i][1]); if(zz == pi) continue; if(a[zz.fi][zz.se] != '*') continue; if(tin[zz.fi][zz.se] == -1){ dfs2(zz, e); up[e.fi][e.se]=min(up[e.fi][e.se], up[zz.fi][zz.se]); } else{ up[e.fi][e.se]=min(up[e.fi][e.se],tin[zz.fi][zz.se]); } } if(up[e.fi][e.se] > tin[e.fi][e.se]){ lis.push_back(e); } } int n, m; pii fin_art(pii ee, bool l){ tt = 0; lis.clear(); for(int i = 0 ; i <= n + 1; i ++ ){ for(int j = 0; j <= m + 1; j ++ ){ tin[i][j]=(int)1e9 + 9; if(i > 0 && i <= n && j > 0 && j <= m){ tin[i][j]=-1; } } } if(!l){ for(auto y : lis){ if(y != ee) return y; } } else{ for(auto y : lis){ if(y != ee && b[y.fi][y.se] != '*') return y; } } return mp(-1,-1); } void make(pii aa, pii bb){ a[aa.fi][aa.se] = '.'; a[bb.fi][bb.se] = '#'; } vector fo, qo; bool vis[N][N]; void dfs3(pii e){ vis[e.fi][e.se]=true; for(int i = 0; i < 4; i ++ ){ pii zz = mp(e.fi + d[i][0], e.se + d[i][1]); if(b[zz.fi][zz.se] == '*' && !vis[zz.fi][zz.se]){ if(a[zz.fi][zz.se] != '*'){ pii q = fin_art(e,true); fo.push_back(q); qo.push_back(zz); make(q,zz); } dfs3(zz); } } } int main(){ fastIO; cin >> n >> m; for(int i = 0 ; i <= n + 1; i ++) { for(int j = 0 ;j <= m + 1; j ++ ){ a[i][j] = 'X'; b[i][j] = 'X'; par[i][j]=mp(-1,-1); } } char f; for(int i = 1; i <= n; i ++ ){ for(int j = 1; j <= m; j ++ ){ cin >> a[i][j]; } } for(int i = 1; i <= n; i ++ ){ for(int j = 1; j <= m; j ++ ){ cin >> b[i][j]; } } pii st; pii en; for(int i = 1; i <= n; i ++ ){ for(int j = 1; j <= m; j ++ ){ if(a[i][j] == '*'){ st=mp(i,j); } if(b[i][j] == '*'){ en=mp(i,j); } } } par[st.fi][st.se] = st; dfs(st); if(par[en.fi][en.se] == mp(-1,-1)){ cout << "NO\n"; return 0; } vector pat; while(en != st){ pat.push_back(en); en = par[en.fi][en.se]; } pat.push_back(st); reverse(pat.begin(), pat.end()); for(int i = 1; i < pat.size(); i ++ ){ pii c = fin_art(pat[i - 1], false); fo.push_back(c); qo.push_back(pat[i]); make(c,pat[i]); } dfs3(en); cout << "YES\n"; cout << fo.size() << "\n"; for(int i = 0; i < fo.size(); i ++ ){ cout << fo[i].fi << " " << fo[i].se << " " << qo[i].fi << " " << qo[i].se << "\n"; } return 0; }