#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline long long read() {
  long long x = 0;
  char ch = getchar();
  bool positive = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') positive = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(long long a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10) write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(long long a) {
  write(a);
  puts("");
}
inline void wri(long long a) {
  write(a);
  putchar(' ');
}
inline unsigned long long rnd() {
  return ((unsigned long long)rand() << 30 ^ rand()) << 4 | rand() % 4;
}
const long double eps = 1e-9, inf = 1e18;
const int N = 905;
inline int dcmp(long double a) { return fabs(a) <= eps ? 0 : (a > 0 ? 1 : -1); }
struct pt {
  long double x, y;
  inline pt operator+(const pt &p) const { return (pt){x + p.x, y + p.y}; }
  inline pt operator-(const pt &p) const { return (pt){x - p.x, y - p.y}; }
  inline pt operator*(const long double &v) const { return (pt){x * v, y * v}; }
  inline long double operator*(const pt &p) const { return x * p.x + y * p.y; }
  inline long double len() { return sqrt(x * x + y * y); }
};
inline long double cross(pt a, pt b) { return a.x * b.y - a.y * b.x; }
inline long double Angle(pt a) { return atan2(a.y, a.x); }
inline long double S(vector<pt> v) {
  if (v.size() <= 2) return 0;
  long double sum = cross(v.back(), v[0]);
  for (int i = (int)(0); i <= (int)(v.size() - 2); i++)
    sum += cross(v[i], v[i + 1]);
  return sum / 2;
}
struct line {
  pt s, t;
};
inline long double Angle(line a) { return Angle(a.t - a.s); }
inline pt jd(line a, line b) {
  pt u = a.s - b.s, v = a.t - a.s, w = b.t - b.s;
  long double t = cross(w, u) / cross(v, w);
  return a.s + v * t;
}
long double ang[N];
line zs[N];
bool cmp(int a, int b) {
  long double A = ang[a], B = ang[b];
  int t = dcmp(A - B);
  return t == 0 ? dcmp(cross(zs[a].t - zs[a].s, zs[b].t - zs[a].s)) < 0 : t < 0;
}
bool check(line a, line b, line c) {
  pt o = jd(b, c);
  long double tmp = cross(a.t - a.s, o - a.s);
  return dcmp(tmp) <= 0;
}
bool px(line a, line b) { return fabs(cross(a.t - a.s, b.t - b.s)) == 0; }
vector<pt> half(vector<line> v) {
  static line q[N];
  int l = 1, r = 0;
  vector<pt> p;
  for (auto i : v) {
    while (l < r && check(i, q[r], q[r - 1])) r--;
    while (l < r && check(i, q[l], q[l + 1])) l++;
    q[++r] = i;
  }
  while (l < r && check(q[l], q[r], q[r - 1])) r--;
  while (l < r && check(q[r], q[l], q[l + 1])) l++;
  if (l + 1 >= r) return p;
  for (int i = (int)(l); i <= (int)(r - 1); i++)
    p.push_back(jd(q[i], q[i + 1]));
  p.push_back(jd(q[r], q[l]));
  return p;
}
pt a[N];
int n, sor[N], vis[N];
pt chu(pt a) { return (pt){a.y, -a.x}; }
vector<pt> check(int l, int r) {
  memset(vis, 0, sizeof(vis));
  for (int i = (int)(l); i <= (int)(r - 1); i++) vis[i % n] = 1;
  vector<line> v;
  long double lst = -inf;
  for (int i = (int)(0); i <= (int)(3 * n - 1); i++)
    if (sor[i] >= 2 * n || vis[sor[i] / 2]) {
      if (dcmp(ang[sor[i]] - lst)) {
        lst = ang[sor[i]];
        v.push_back(zs[sor[i]]);
      }
    }
  return half(v);
}
vector<pt> solve(long double mid) {
  for (int i = (int)(0); i <= (int)(n - 1); i++) {
    zs[2 * i] = (line){a[i], a[(i + 1) % n]};
    zs[2 * i + 1] = (line){a[(i + 1) % n], a[i]};
  }
  for (int i = (int)(0); i <= (int)(2 * n - 1); i++) {
    pt jj = chu(zs[i].t - zs[i].s);
    long double ab = 1 / (zs[i].t - zs[i].s).len();
    zs[i].s = zs[i].s + jj * ab * mid;
    zs[i].t = zs[i].t + jj * ab * mid;
  }
  for (int i = (int)(0); i <= (int)(n - 1); i++)
    zs[i + 2 * n] = (line){a[i], a[(i + 1) % n]};
  for (int i = (int)(0); i <= (int)(3 * n - 1); i++) {
    sor[i] = i;
    ang[i] = Angle(zs[i]);
  }
  sort(sor, sor + 3 * n, cmp);
  vector<pt> ans;
  int j = 0;
  for (int i = (int)(0); i <= (int)(n - 1); i++) {
    vector<pt> x, y;
    while (j < i + n && (y = check(i, j + 1)).size()) x = y, j++;
    if (j == i + n) {
      ans.push_back(x[0]);
      ans.push_back(x[0]);
      return ans;
    }
    y = check(j, i + n);
    if (y.size()) {
      ans.push_back(x[0]);
      ans.push_back(y[0]);
      return ans;
    }
  }
  return ans;
}
int main() {
  n = read();
  for (int i = (int)(0); i <= (int)(n - 1); i++) {
    a[i].x = read();
    a[i].y = read();
    a[i + n] = a[i];
  }
  int j = 0;
  long double ans = 1e100;
  pair<int, int> jb;
  long double L = 0, R = 40000;
  while (L + max((long double)1, L) * 2e-7 < R) {
    long double mid = (L + R) / 2;
    if (solve(mid).size())
      R = mid;
    else
      L = mid;
  }
  printf("%.9f\n", (double)R);
  vector<pt> jjl = solve(R);
  pt zs = jjl[0];
  printf("%.9f %.9f\n", (double)zs.x, (double)zs.y);
  zs = jjl[1];
  printf("%.9f %.9f\n", (double)zs.x, (double)zs.y);
}
