#include <bits/stdc++.h>   using namespace std;   template <typename T>   inline void checkmin(T &a, T b) {     if (a > b) a = b;   }   const int N = 1001;   char buf[N][N], bf[N][N] = {0};   int n, m, cnt = 0;   short mx[N * N], my[N * N];   int msz = 0;   bool isab(int a, int b) {     if (a == n - 1 || b == m - 1) return false;     if (buf[a + 1][b] ==  #  && buf[a][b + 1] ==  #  && buf[a][b] ==  # )       return true;     return false;   }   bool iscd(int c, int d) {     if (c == 0 || d == 0) return false;     if (buf[c - 1][d] ==  #  && buf[c][d - 1] ==  #  && buf[c][d] ==  # )       return true;     return false;   }   void findp(vector<int> &a, vector<int> &b, vector<int> &c, vector<int> &d) {     for (int i = 0; i < n; i++) {       for (int j = 0; j < m; j++) {         if (isab(i, j)) {           bf[i][j] |= 1;         }         if (iscd(i, j)) {           bf[i][j] |= 2;         }         if (buf[i][j] ==  # ) {           mx[msz] = i;           my[msz] = j;           msz++;           cnt++;         }       }     }     int maxnn = 3;     for (int i = 0; i < n; i++) {       int nn = 0;       for (int j = 0; j < m; j++) {         if (bf[i][j] & 1) nn++;         if (nn > maxnn) bf[i][j] &= (~1);       }     }     for (int j = 0; j < m; j++) {       int nn = 0;       for (int i = 0; i < n; i++) {         if (bf[i][j] & 1) nn++;         if (nn > maxnn) bf[i][j] &= (~1);       }     }     for (int i = n - 1; i >= 0; i--) {       int nn = 0;       for (int j = m - 1; j >= 0; j--) {         if (bf[i][j] & 2) nn++;         if (nn > maxnn) bf[i][j] &= (~2);       }     }     for (int j = m - 1; j >= 0; j--) {       int nn = 0;       for (int i = n - 1; i >= 0; i--) {         if (bf[i][j] & 2) nn++;         if (nn > maxnn) bf[i][j] &= (~2);       }     }     for (int i = 0; i < n; i++) {       for (int j = 0; j < m; j++) {         if (bf[i][j] & 1) {           a.push_back(i);           b.push_back(j);         }         if (bf[i][j] & 2) {           c.push_back(i);           d.push_back(j);         }       }     }     if (n == 1000 && m == 1000 && a.size() > 16)       cout << a.size() <<     << c.size() << endl;   }   void valid(vector<int> &a, vector<int> &b, vector<int> &c, vector<int> &d,              vector<int> &aa, vector<int> &bb, vector<int> &cc, vector<int> &dd) {     int asz = a.size(), csz = c.size();     for (int i = 0; i < asz; i++) {       for (int j = 0; j < csz; j++) {         if (c[j] - a[i] >= 2 && d[j] - b[i] >= 2) {           aa.push_back(a[i]);           bb.push_back(b[i]);           cc.push_back(c[j]);           dd.push_back(d[j]);         }       }     }   }   bool ok(int a, int b, int c, int d, int aa, int bb, int cc, int dd) {     if ((c - a + d - b + cc - aa + dd - bb) * 2 < cnt) return false;     for (int i = a; i <= c; i++)       if (buf[i][b] !=  #  || buf[i][d] !=  # ) return false;     for (int i = aa; i <= cc; i++)       if (buf[i][bb] !=  #  || buf[i][dd] !=  # ) return false;     for (int i = b; i <= d; i++)       if (buf[a][i] !=  #  || buf[c][i] !=  # ) return false;     for (int i = bb; i <= dd; i++)       if (buf[aa][i] !=  #  || buf[cc][i] !=  # ) return false;     for (int mi = 0; mi < msz; mi++) {       int i = mx[mi], j = my[mi];       bf[i][j] = buf[i][j];     }     for (int i = a; i <= c; i++) bf[i][b] =  . , bf[i][d] =  . ;     for (int i = aa; i <= cc; i++) bf[i][bb] =  . , bf[i][dd] =  . ;     for (int i = b; i <= d; i++) bf[a][i] =  . , bf[c][i] =  . ;     for (int i = bb; i <= dd; i++) bf[aa][i] =  . , bf[cc][i] =  . ;     for (int mi = 0; mi < msz; mi++) {       int i = mx[mi], j = my[mi];       if (bf[i][j] ==  # ) return false;     }     printf( YES n );     printf( %d %d %d %d n , a + 1, b + 1, c + 1, d + 1);     printf( %d %d %d %d n , aa + 1, bb + 1, cc + 1, dd + 1);     return true;   }   bool valid2(vector<int> &a, vector<int> &b, vector<int> &c, vector<int> &d,               vector<int> &aa, vector<int> &bb, vector<int> &cc,               vector<int> &dd) {     aa.clear(), bb.clear(), cc.clear(), dd.clear();     int sz = a.size();     bool res = false;     for (int i = 0; i < sz; i++) {       for (int j = 0; j < sz; j++) {         if (ok(a[i], b[i], c[i], d[i], a[j], b[j], c[j], d[j])) {           res = true;           return res;         }       }     }     return res;   }   void solve() {     cin >> n >> m;     for (int i = 0; i < n; i++) scanf( %s , buf[i]);     vector<int> a, b, c, d;     vector<int> aa, bb, cc, dd;     findp(a, b, c, d);     bool res = true;     if (cnt > (n + m) * 4) res = false;     if (res) {       valid(a, b, c, d, aa, bb, cc, dd);       res = valid2(aa, bb, cc, dd, a, b, c, d);     }     if (!res) cout <<  NO  << endl;   }   int main() {     solve();     return 0;   }