#include <bits/stdc++.h>
using namespace std;
struct point {
  int xc;
  int yc;
};
int fun(int r, int c, int x, int y, int n) {
  if (!n) return 1;
  int ans = 0, u, v;
  u = max(y, y + n - x);
  v = min(c - 1, y + n);
  ans += max(0, v - u + 1);
  u = max(y, y + x + n - r + 1);
  ans += max(0, v - u + 1);
  u = max(y - n, 0);
  v = min(y, y + x - n);
  ans += max(0, v - u + 1);
  v = min(y, y + r - x - n - 1);
  ans += max(0, v - u + 1);
  ans -= (x + n < r) + (x - n >= 0) + (y + n < c) + (y - n >= 0);
  return ans;
}
int main() {
  int t, i, n, m, x, y, j, k, f = 0, ma = 0;
  cin >> t;
  set<pair<int, int> >::iterator it;
  pair<int, int> temp;
  vector<int> ca(t + 1, 0);
  for (i = 0; i < t; i++) {
    cin >> j;
    ma = max(ma, j);
    ca[j]++;
  }
  for (i = 1; i < (int)sqrt(t) + 1; i++) {
    if (t % i == 0) {
      set<pair<int, int> > s;
      for (j = 0; j < i; j++) {
        for (k = 0; k < t / i; k++) {
          if (fun(i, t / i, j, k, ma) == ca[ma]) {
            temp.first = j;
            temp.second = k;
            s.insert(temp);
          }
        }
      }
      j = ma - 1;
      if (!s.empty()) it = s.begin();
      while (!s.empty() && j >= 0) {
        for (it = s.begin(); it != s.end() && j >= 0;) {
          if (fun(i, t / i, it->first, it->second, j) == ca[j])
            j--;
          else {
            s.erase(it++);
          }
        }
      }
      if (j < 0 && !s.empty()) {
        break;
      }
    }
  }
  if (i < (int)sqrt(t) + 1) {
    cout << i << " " << t / i << endl;
    cout << (it->first) + 1 << " " << (it->second) + 1;
  } else {
    cout << -1;
  }
  return 0;
}
