#include <bits/stdc++.h>
using namespace std;
int n, m, mx[4][4], chose[4], seq[8], a[4], b[4], x[1000005], y[1000005], cnt;
char Map[1005][1005];
bool vis[1005][1005];
int ans[100005][4], cnt_ans;
int arr[100005], ct;
bool flag = 0;
void check() {
  if (a[0] == 1 && a[1] == 3 && a[2] == 2 && a[3] == 7 && b[0] == 1 &&
      b[1] == 3 && b[2] == 2 && b[3] == 7)
    printf("\n");
  if (a[1] - a[0] < 2 || a[3] - a[2] < 2 || b[1] - b[0] < 2 || b[3] - b[2] < 2)
    return;
  bool ERROR = 0;
  for (int i = a[0]; i <= a[1]; i++) {
    if (Map[i][a[2]] == '.' || Map[i][a[3]] == '.') ERROR = 1;
    vis[i][a[2]] = vis[i][a[3]] = 1;
  }
  for (int i = a[2]; i <= a[3]; i++) {
    if (Map[a[0]][i] == '.' || Map[a[1]][i] == '.') ERROR = 1;
    vis[a[0]][i] = vis[a[1]][i] = 1;
  }
  for (int i = b[0]; i <= b[1]; i++) {
    if (Map[i][b[2]] == '.' || Map[i][b[3]] == '.') ERROR = 1;
    vis[i][b[2]] = vis[i][b[3]] = 1;
  }
  for (int i = b[2]; i <= b[3]; i++) {
    if (Map[b[0]][i] == '.' || Map[b[1]][i] == '.') ERROR = 1;
    vis[b[0]][i] = vis[b[1]][i] = 1;
  }
  for (int i = 1; i <= cnt; i++)
    if (!vis[x[i]][y[i]]) ERROR = 1;
  for (int i = a[0]; i <= a[1]; i++) vis[i][a[2]] = vis[i][a[3]] = 0;
  for (int i = a[2]; i <= a[3]; i++) vis[a[0]][i] = vis[a[1]][i] = 0;
  for (int i = b[0]; i <= b[1]; i++) vis[i][b[2]] = vis[i][b[3]] = 0;
  for (int i = b[2]; i <= b[3]; i++) vis[b[0]][i] = vis[b[1]][i] = 0;
  if (!ERROR) {
    flag = 1;
    puts("YES");
    printf("%d %d %d %d\n%d %d %d %d\n", a[0], a[2], a[1], a[3], b[0], b[2],
           b[1], b[3]);
  }
}
void dfs(int now) {
  if (now == 8) {
    for (int i = 0; i < 4; i++) a[i] = seq[i], b[i] = seq[i + 4];
    check();
    return;
  }
  for (int i = 0; i < 4; i++)
    if (mx[now % 4][i]) {
      seq[now] = mx[now % 4][i];
      dfs(now + 1);
      if (flag) return;
    }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%s", Map[i] + 1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (Map[i][j] == '#') cnt++, x[cnt] = i, y[cnt] = j;
  ct = 0;
  for (int i = 1; i <= n; i++) {
    int sum = 0;
    for (int j = 1; j <= m; j++) {
      if (Map[i][j] == '.')
        sum = 0;
      else
        sum++;
      if (sum >= 3) {
        arr[++ct] = i;
        break;
      }
    }
  }
  for (int i = 1; i <= min(4, ct); i++) mx[0][i - 1] = arr[i];
  for (int i = ct; i > max(ct - 4, 0); i--) mx[1][ct - i] = arr[i];
  ct = 0;
  for (int i = 1; i <= m; i++) {
    int sum = 0;
    for (int j = 1; j <= n; j++) {
      if (Map[j][i] == '.')
        sum = 0;
      else
        sum++;
      if (sum >= 3) {
        arr[++ct] = i;
        break;
      }
    }
  }
  for (int i = 1; i <= min(4, ct); i++) mx[2][i - 1] = arr[i];
  for (int i = ct; i > max(ct - 4, 0); i--) mx[3][ct - i] = arr[i];
  dfs(0);
  if (!flag) puts("NO");
}
