#include <bits/stdc++.h>
const long long INF = 4e18L + 1;
const int IINF = 2e9 + 1;
const int limit = 1048576;
using namespace std;
const long double eps = 1e-9;
const long double fail = 1.52345e-14;
bool eq(long double a, long double b) { return fabs(a - b) < eps; }
struct vec2 {
  long double x, y;
  vec2(long double x1, long double y1) : x{x1}, y{y1} {}
  vec2() = default;
  long double len() { return sqrt(x * x + y * y); };
};
long double operator*(vec2 a, vec2 b) { return a.x * b.x + a.y * b.y; }
vec2 operator*(long double c, vec2 a) { return vec2(c * a.x, c * a.y); }
vec2 operator-(vec2 a, vec2 b) { return vec2(a.x - b.x, a.y - b.y); }
vec2 operator+(vec2 a, vec2 b) { return vec2(a.x + b.x, a.y + b.y); }
vec2 operator-(vec2 a) { return vec2(-a.x, -a.y); }
ostream& operator<<(ostream& stream, const vec2& v) {
  return stream << v.x << " " << v.y;
}
struct line {
  vec2 n;
  long double c;
  line(vec2 n1, long double c1) : n{(1.0 / n1.len()) * n1}, c{c1} {}
  vec2 dir() const { return vec2(n.y, -n.x); }
  long double intersect(const line& other) const {
    long double det = (n.x * other.n.y - n.y * other.n.x);
    if (fabs(det) < eps) {
      return fail;
    }
    return (other.c - c * (n * other.n)) / (dir() * other.n);
  }
};
vec2 intersect(const line& a, const line& b) {
  long double t = a.intersect(b);
  if (eq(t, fail)) {
    return vec2(fail, fail);
  } else {
    return a.c * a.n + t * a.dir();
  }
}
bool find_intersection(vec2& cand, vector<line> semiplanes) {
  random_shuffle((semiplanes).begin(), (semiplanes).end());
  while (eq(semiplanes[0].n * semiplanes[1].dir(), 0)) {
    random_shuffle((semiplanes).begin(), (semiplanes).end());
  }
  cand = intersect(semiplanes[0], semiplanes[1]);
  vec2 opt_dir = -(semiplanes[0].n + semiplanes[1].n);
  for (int i = (int)2; i < (int)semiplanes.size(); i++) {
    line& l = semiplanes[i];
    if (l.n * cand < l.c - eps) {
      long double min_t = -INF, max_t = INF;
      for (int j = (int)0; j < (int)i; j++) {
        line l1 = semiplanes[j];
        if (eq(l.dir() * l1.n, 0)) {
          if (l.n * l1.n < 0 and l1.c * l1.n * l.n < l.c) {
            return false;
          }
          continue;
        }
        if (l.dir() * l1.n > 0) {
          min_t = max(min_t, l.intersect(l1));
        } else {
          max_t = min(max_t, l.intersect(l1));
        }
      }
      if (min_t > max_t) {
        return false;
      } else {
        if (l.dir() * opt_dir > 0) {
          cand = l.c * l.n + max_t * l.dir();
        } else {
          cand = l.c * l.n + min_t * l.dir();
        }
      }
    }
  }
  return true;
}
int n;
vector<vec2> polygon;
void add_constr(vector<line>& constr, vec2 a, vec2 b, long double r) {
  vec2 d = b - a;
  vec2 nm = (1.0 / d.len()) * vec2(-d.y, d.x);
  constr.push_back(line(nm, a * nm));
  constr.push_back(line(-nm, a * (-nm) - r));
}
bool check_r(long double r, vec2& candB, vec2& candL) {
  int i1 = 2;
  vector<int> best(n);
  vector<vec2> cand(n);
  for (int i = (int)0; i < (int)n; i++) {
    cand[i] = polygon[(i + 1) % n];
  }
  for (int i = (int)0; i < (int)n; i++) {
    if (i1 == i or i1 == (i + 1) % n) {
      i1 = (i + 2) % n;
    }
    best[i] = (n + i1 - i) % n;
    while (i1 != i) {
      vector<line> constr;
      int j = i;
      do {
        add_constr(constr, polygon[j], polygon[(j + 1) % n], r);
        j = (j == n - 1) ? 0 : j + 1;
      } while (j != (i1 + 1) % n);
      if (constr.size() <= 4) {
        cout << "WOT" << endl;
      }
      vec2 temp_cand;
      if (find_intersection(temp_cand, constr)) {
        cand[i] = temp_cand;
        i1 = (i1 == n - 1) ? 0 : i1 + 1;
        best[i] = (i1 == i) ? n : (n + i1 - i) % n;
      } else {
        break;
      }
    }
  }
  for (int i = (int)0; i < (int)n; i++) {
    if (best[i] + best[(i + best[i]) % n] >= n) {
      candB = cand[i];
      candL = cand[(i + best[i]) % n];
      return true;
    }
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  polygon.resize(n);
  for (auto& v : polygon) {
    cin >> v.x >> v.y;
  }
  long double start = 0.0, fin = 1e5;
  vec2 Bar, Lya;
  for (int i = (int)0; i < (int)120; i++) {
    long double m = (start + fin) / 2.0;
    vec2 candB, candL;
    if (check_r(m, candB, candL)) {
      fin = m;
      Bar = candB;
      Lya = candL;
    } else {
      start = m;
    }
  }
  cout << setprecision(8) << fixed << fin << "\n";
  cout << Bar << "\n";
  cout << Lya << "\n";
  return 0;
}
