#include <bits/stdc++.h>
using namespace std;
pair<int, int> p[1100 * 1100];
int n, m;
char mat[1100][1100];
int sum[1100][1100];
int get(int x0, int y0, int x1, int y1) {
  return sum[x1][y1] - sum[x1][y0 - 1] - sum[x0 - 1][y1] + sum[x0 - 1][y0 - 1];
}
bool canRec(int x0, int y0, int x1, int y1) {
  if (x1 < x0 + 2 || y1 < y0 + 2) return false;
  if (get(x0, y0, x0, y1) != (y1 - y0 + 1)) return false;
  if (get(x0, y0, x1, y0) != (x1 - x0 + 1)) return false;
  if (get(x1, y0, x1, y1) != (y1 - y0 + 1)) return false;
  if (get(x0, y1, x1, y1) != (x1 - x0 + 1)) return false;
  return true;
}
bool in(int x0, int y0, int x1, int y1, int x, int y) {
  if (x >= x0 && x <= x1 && (y == y0 || y == y1)) return true;
  if (y >= y0 && y <= y1 && (x == x0 || x == x1)) return true;
  return false;
}
int main() {
  while (scanf("%d %d", &n, &m) != EOF) {
    int cnt = 0;
    for (int i = (1); i < (n + 1); i++) {
      scanf(" %s", mat[i] + 1);
      for (int j = (1); j < (m + 1); j++) {
        sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] +
                    (mat[i][j] == '#');
        if (mat[i][j] == '#') {
          p[cnt++] = make_pair(i, j);
        }
      }
    }
    if (cnt > 8100) {
      puts("NO");
      continue;
    }
    sort(p, p + cnt);
    for (int i = (1); i < (cnt); i++) {
      int x0 = p[0].first, y0 = p[0].second;
      int x1 = p[i].first, y1 = p[i].second;
      if (canRec(x0, y0, x1, y1) == false) continue;
      set<int> stx, sty;
      stx.insert(x0);
      stx.insert(x1);
      sty.insert(y0);
      sty.insert(y1);
      int xma = 0, xmi = 10000, yma = xma, ymi = xmi;
      int num = 0;
      for (int j = (0); j < (cnt); j++)
        if (in(x0, y0, x1, y1, p[j].first, p[j].second) == false) {
          xma = max(xma, p[j].first);
          xmi = min(xmi, p[j].first);
          yma = max(yma, p[j].second);
          ymi = min(ymi, p[j].second);
          num++;
        }
      if (num == 0) {
        puts("YES");
        printf("%d %d %d %d\n", x0, y0, x1, y1);
        printf("%d %d %d %d\n", x0, y0, x1, y1);
        return 0;
      }
      stx.insert(xmi);
      if (xmi - 1 > 0) stx.insert(xmi - 1);
      stx.insert(xma);
      if (xma + 1 <= n) stx.insert(xma + 1);
      sty.insert(ymi);
      if (ymi - 1 > 0) sty.insert(ymi - 1);
      sty.insert(yma);
      if (yma + 1 <= m) sty.insert(yma + 1);
      for (typeof(stx.begin()) itx1 = stx.begin(); itx1 != stx.end(); ++itx1)
        for (typeof(stx.begin()) itx2 = stx.begin(); itx2 != stx.end();
             ++itx2) {
          if (*itx1 + 2 <= *itx2) {
            for (typeof(sty.begin()) ity1 = sty.begin(); ity1 != sty.end();
                 ++ity1)
              for (typeof(sty.begin()) ity2 = sty.begin(); ity2 != sty.end();
                   ++ity2) {
                if (*ity1 + 2 <= *ity2) {
                  int _x0 = *itx1, _y0 = *ity1;
                  int _x1 = *itx2, _y1 = *ity2;
                  if (canRec(_x0, _y0, _x1, _y1) == false) continue;
                  bool suc = true;
                  for (int j = (0); j < (cnt); j++) {
                    if (in(x0, y0, x1, y1, p[j].first, p[j].second)) continue;
                    if (in(_x0, _y0, _x1, _y1, p[j].first, p[j].second))
                      continue;
                    suc = false;
                    break;
                  }
                  if (suc) {
                    puts("YES");
                    printf("%d %d %d %d\n", x0, y0, x1, y1);
                    printf("%d %d %d %d\n", _x0, _y0, _x1, _y1);
                    return 0;
                  }
                }
              }
          }
        }
    }
    puts("NO");
  }
}
