#include <bits/stdc++.h>
using namespace std;
char buf[1010];
bool isf[1010][1010];
bool vis[1010][1010];
bool f[2010][2010];
bool ok[2010][2010];
bool nok[2010][2010];
set<pair<int, int> > st, stt;
int sum;
int n, m;
int d[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
vector<pair<int, int> > v;
bool check(pair<int, int> a, pair<int, int> b) {
  int mnx = min(a.first, b.first), mxx = max(a.first, b.first),
      mny = min(a.second, b.second), mxy = max(a.second, b.second);
  if (mxx - mnx < 2 || mxy - mny < 2) return false;
  for (int i = mny; i <= mxy; i++) {
    if (!isf[mnx][i]) {
      return false;
    }
    st.insert(make_pair(mnx, i));
  }
  for (int i = mny; i <= mxy; i++) {
    if (!isf[mxx][i]) {
      return false;
    }
    st.insert(make_pair(mxx, i));
  }
  for (int i = mnx; i <= mxx; i++) {
    if (!isf[i][mny]) {
      return false;
    }
    st.insert(make_pair(i, mny));
  }
  for (int i = mnx; i <= mxx; i++) {
    if (!isf[i][mxy]) {
      return false;
    }
    st.insert(make_pair(i, mxy));
  }
  return true;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%s", buf);
    for (int j = 0; j < m; j++)
      if (buf[j] == '#') isf[i][j + 1] = true, sum++;
  }
  for (int i = 1; i <= n; i++) {
    vector<int> t;
    for (int j = 1; j <= m; j++) {
      if (isf[i][j]) {
        if ((isf[i - 1][j] + isf[i + 1][j] == 1) ||
            (isf[i][j - 1] + isf[i][j + 1] == 1) ||
            (isf[i - 1][j] + isf[i + 1][j] + isf[i][j - 1] + isf[i][j + 1] ==
             4))
          ok[i][j] = true;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    int s = 0;
    for (int j = 1; j <= m; j++) {
      if (ok[i][j]) {
        s++;
        if (s <= 2) nok[i][j] = true;
      }
    }
    s = 0;
    for (int j = m; j >= 1; j--) {
      if (ok[i][j]) {
        s++;
        if (s <= 2) nok[i][j] = true;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) ok[i][j] = nok[i][j], nok[i][j] = false;
  }
  for (int j = 1; j <= m; j++) {
    int s = 0;
    for (int i = 1; i <= n; i++) {
      if (ok[i][j]) {
        s++;
        if (s <= 2) nok[i][j] = true;
      }
    }
    s = 0;
    for (int i = n; i >= 1; i--) {
      if (ok[i][j]) {
        s++;
        if (s <= 2) nok[i][j] = true;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      if (nok[i][j]) v.push_back(make_pair(i, j));
  }
  if (v.size() > 1000) {
    printf("NO");
    return 0;
  }
  for (int i = 0; i + 1 < v.size(); i++) {
    for (int j = i + 1; j < v.size(); j++)
      if (check(v[i], v[j])) f[i][j] = true;
  }
  for (int i = 0; i + 1 < v.size(); i++) {
    for (int j = i + 1; j < v.size(); j++) {
      if (!f[i][j]) continue;
      st.clear();
      check(v[i], v[j]);
      stt = st;
      for (int k = i; k + 1 < v.size(); k++) {
        for (int l = k + 1; l < v.size(); l++) {
          if (!f[k][l]) continue;
          st = stt;
          check(v[k], v[l]);
          if (st.size() == sum) {
            puts("YES");
            printf("%d %d %d %d\n", min(v[i].first, v[j].first),
                   min(v[i].second, v[j].second), max(v[i].first, v[j].first),
                   max(v[i].second, v[j].second));
            printf("%d %d %d %d", min(v[k].first, v[l].first),
                   min(v[k].second, v[l].second), max(v[k].first, v[l].first),
                   max(v[k].second, v[l].second));
            return 0;
          }
        }
      }
    }
  }
  printf("NO");
  return 0;
}
