#include <bits/stdc++.h>
using namespace std;
struct range {
  long long l, r;
  range() {}
};
union rect {
  struct {
    long long x, y, xx, yy;
  };
  long long a[4];
  rect() {}
  rect(long long x, long long y, long long xx, long long yy)
      : x(x), y(y), xx(xx), yy(yy) {}
};
long long query(const rect &r) {
  static rect first = {3, 4, 3, 5}, second = {2, 2, 2, 2};
  if (r.x > r.xx || r.y > r.yy) {
    return 0;
  }
  static int cnt = 0;
  cnt++;
  if (cnt == 200) throw;
  cout << "? " << r.x << " " << r.y << " " << r.xx << " " << r.yy << "\n"
       << flush;
  long long ans;
  cin >> ans;
  return ans;
}
ostream &operator<<(ostream &cout, const rect &r) {
  cout << r.x << " " << r.y << " " << r.xx << " " << r.yy;
  return cout;
}
void answer(rect a, rect b) {
  cout << "! " << a << " " << b << "\n" << flush;
  exit(0);
}
long long fnc_lower(rect re, long long pos, long long cnt) {
  long long l = re.a[pos], r = re.a[pos + 2];
  while (l != r) {
    long long m = (l + r + 1) / 2;
    re.a[pos] = m;
    if ((query(re) == cnt))
      l = m;
    else
      r = m - 1;
  }
  return l;
}
long long fnc_upper(rect re, long long pos, long long cnt) {
  long long l = re.a[pos - 2], r = re.a[pos];
  while (l != r) {
    long long m = (l + r) / 2;
    re.a[pos] = m;
    if (!(query(re) == cnt))
      l = m + 1;
    else
      r = m;
  }
  return l;
}
void minimize(rect &r, long long cnt) {
  for (long long i = 0; i < 2; ++i) {
    r.a[i] = fnc_lower(r, i, cnt);
  }
  for (long long i = 2; i < 4; ++i) {
    r.a[i] = fnc_upper(r, i, cnt);
  }
}
int main() {
  ios::sync_with_stdio(0);
  long long n;
  cin >> n;
  rect all_rect = rect(1, 1, n, n);
  minimize(all_rect, 2);
  rect one_rect = all_rect;
  minimize(one_rect, 1);
  rect another_rect;
  another_rect = all_rect;
  another_rect.x = one_rect.xx + 1;
  if (query(another_rect) == 1) {
    minimize(another_rect, 1);
    answer(one_rect, another_rect);
  }
  another_rect = all_rect;
  another_rect.xx = one_rect.x - 1;
  if (query(another_rect) == 1) {
    minimize(another_rect, 1);
    answer(one_rect, another_rect);
  }
  another_rect = all_rect;
  another_rect.y = one_rect.yy + 1;
  if (query(another_rect) == 1) {
    minimize(another_rect, 1);
    answer(one_rect, another_rect);
  }
  another_rect = all_rect;
  another_rect.yy = one_rect.y - 1;
  if (query(another_rect) == 1) {
    minimize(another_rect, 1);
    answer(one_rect, another_rect);
  }
  return 0;
}
