#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000007;
int n, m, cnt, tag;
char a[1005][1005];
set<int> ROW, COL;
bool cover(int ar, int ac, int br, int bc) {
  for (int r = ar; r <= br; r++) {
    if (a[r][ac] == '.') return false;
    if (a[r][bc] == '.') return false;
    if (a[r][ac] == '#') a[r][ac] = '%', tag++;
    if (a[r][bc] == '#') a[r][bc] = '%', tag++;
  }
  for (int c = ac; c <= bc; c++) {
    if (a[ar][c] == '.') return false;
    if (a[br][c] == '.') return false;
    if (a[ar][c] == '#') a[ar][c] = '%', tag++;
    if (a[br][c] == '#') a[br][c] = '%', tag++;
  }
  return true;
}
void reset(int ar, int ac, int br, int bc) {
  for (int r = ar; r <= br; r++) {
    if (a[r][ac] == '%') a[r][ac] = '#';
    if (a[r][bc] == '%') a[r][bc] = '#';
  }
  for (int c = ac; c <= bc; c++) {
    if (a[ar][c] == '%') a[ar][c] = '#';
    if (a[br][c] == '%') a[br][c] = '#';
  }
}
int main() {
  ifstream ff("file.txt");
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i] + 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (a[i][j] == '#') cnt++;
      if (j + 2 <= m && a[i][j] == '#' && a[i][j + 1] == '#' &&
          a[i][j + 2] == '#')
        ROW.insert(i);
      if (i + 2 <= n && a[i][j] == '#' && a[i + 1][j] == '#' &&
          a[i + 2][j] == '#')
        COL.insert(j);
    }
  }
  vector<int> row, col;
  for (auto i = ROW.begin(); i != ROW.end(); ++i) {
    row.push_back(*i);
    if (row.size() == 2) break;
  }
  for (auto i = ROW.rbegin(); i != ROW.rend(); ++i) {
    row.push_back(*i);
    if (row.size() == 4) break;
  }
  for (auto i = COL.begin(); i != COL.end(); ++i) {
    col.push_back(*i);
    if (col.size() == 2) break;
  }
  for (auto i = COL.rbegin(); i != COL.rend(); ++i) {
    col.push_back(*i);
    if (col.size() == 4) break;
  }
  sort(row.begin(), row.end());
  sort(col.begin(), col.end());
  row.erase(unique(row.begin(), row.end()), row.end());
  col.erase(unique(col.begin(), col.end()), col.end());
  for (size_t xi = 0; xi < row.size(); xi++)
    for (size_t xj = xi + 1; xj < row.size(); xj++)
      for (size_t xp = 0; xp < col.size(); xp++) {
        for (size_t xq = xp + 1; xq < col.size(); xq++) {
          int ar = row[xi], br = row[xj];
          int ac = col[xp], bc = col[xq];
          if (br - ar <= 1 || bc - ac <= 1) continue;
          for (size_t yi = 0; yi < row.size(); yi++)
            for (size_t yj = yi + 1; yj < row.size(); yj++)
              for (size_t yp = 0; yp < col.size(); yp++)
                for (size_t yq = yp + 1; yq < col.size(); yq++) {
                  int AR = row[yi], BR = row[yj];
                  int AC = col[yp], BC = col[yq];
                  if (BR - AR <= 1 || BC - AC <= 1) continue;
                  tag = 0;
                  if (cover(ar, ac, br, bc) && cover(AR, AC, BR, BC) &&
                      tag == cnt) {
                    puts("YES");
                    printf("%d %d %d %d\n", ar, ac, br, bc);
                    printf("%d %d %d %d\n", AR, AC, BR, BC);
                    return 0;
                  }
                  reset(ar, ac, br, bc);
                  reset(AR, AC, BR, BC);
                }
        }
      }
  puts("NO");
}
