#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <functional>
#include <stack>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
#define eps 1e-8
#define MAXN 1e9
#define defAng auto si=sin(angle);\
auto co=cos(angle);
class vec
{
public:
vec(double xx=0,double yy=0):x(xx),y(yy)
{
}
double x,y;
double len()
{
return sqrt(x*x+y*y);
}
bool operator ==(const vec &a)
{
return a.x==x&&a.y==y;
}
vec unit()//单位向量
{
auto l=len();
return vec(x/l,y/l);
}
vec normal()//单位法向量
{
return vec(-y,x).unit();
}
void debug()
{
printf("%lf %lf\n",x,y);
}
};
typedef vec point;
int dcmp(double x)
{
if (fabs(x)<eps) return 0;
else return x<0?-1:1;
}
double sqr(double x)
{
return x*x;
}
vec operator +(vec a,vec b)
{
return vec(a.x+b.x,a.y+b.y);
}
vec operator -(vec a,vec b)
{
return vec(a.x-b.x,a.y-b.y);
}
vec operator *(vec a,double b)
{
return vec(a.x*b,a.y*b);
}
vec operator /(vec a,double b)
{
return vec(a.x/b,a.y/b);
}
double dot(vec a,vec b)
{
return a.x*b.x+a.y*b.y;
}
double cross(vec a,vec b)
{
return a.x*b.y-a.y*b.x;
}
double angle(vec a,vec b)
{
return acos(dot(a,b)/a.len()/b.len());
}
vec rotate(vec a,double angle)//逆时针旋转
{
defAng
return vec(co,si)*a.x+(vec(-si,co))*a.y;
}
double distl(point p,point a,point b)//点到直线距离
{
vec line=b-a;
return fabs(cross(p-a,line))/line.len();
}
double distr(point p,point a,point b)//点到线段距离
{
if (a==b)
return (p-a).len();
vec l1=p-a;
vec l2=p-b;
vec l=b-a;
if (dcmp(dot(l1,l)<0))
return l1.len();
if (dcmp(dot(l2,l)<0))
return l2.len();
return fabs(cross(l1,l))/l.len();
}
double iscrossr(point a,point b,point c,point d)//判断线段是否相交(快速排斥实验和跨立实验)
{
if (!(min(a.x,b.x)<max(c.x,d.x)&&min(a.y,b.y)<max(c.y,d.y)&&min(c.y,d.y)<max(a.y,b.y)&&min(c.x,d.x)<max(a.x,b.x)))
return false;
return dcmp(cross(b-a,c-a)*dcmp(cross(b-a,d-a)))<=0&&dcmp(cross(d-c,a-c))*dcmp(cross(d-c,b-c))<=0;
}
vec getcross(point a,point b,point c,point d)//两直线的交点,直接解方程即可
{
double c1=cross(a,b);
double c2=cross(c,d);
return vec(c1*(c.x-d.x)-c2*(a.x-b.x),c1*(c.y-d.y)-c2*(a.y-b.y))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x));
}
point geto(point a, point b, point c) {
double a1, a2, b1, b2, c1, c2;
point ans;
a1 = 2 * (b.x - a.x), b1 = 2 * (b.y - a.y),
c1 = sqr(b.x) - sqr(a.x) + sqr(b.y) - sqr(a.y);
a2 = 2 * (c.x - a.x), b2 = 2 * (c.y - a.y),
c2 = sqr(c.x) - sqr(a.x) + sqr(c.y) - sqr(a.y);
if (dcmp(a1)==0) {
ans.y = c1 / b1;
ans.x = (c2 - ans.y * b2) / a2;
} else if (dcmp(b1)==0) {
ans.x = c1 / a1;
ans.y = (c2 - ans.x * a2) / b2;
} else {
ans.x = (c2 * b1 - c1 * b2) / (a2 * b1 - a1 * b2);
ans.y = (c2 * a1 - c1 * a2) / (b2 * a1 - b1 * a2);
}
return ans;
}
int main()
{
vector<point> p;
int n;
double r=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
p.emplace_back(point(x,y));
}
random_shuffle(p.begin(),p.end());
auto o=p[0];
for (int i=0;i<n;i++)
{
if (dcmp((o-p[i]).len()-r)<=0)
continue;
o.x=(p[0].x+p[i].x)/2;
o.y=(p[0].y+p[i].y)/2;
r=(p[i]-p[0]).len()/2;
for (int j=1;j<i;j++)
{
if (dcmp((o-p[j]).len()-r)<=0)
continue;
o.x=(p[i].x+p[j].x)/2;
o.y=(p[i].y+p[j].y)/2;
r=(p[j]-p[i]).len()/2;
for (int k=0;k<j;k++)
{
if (dcmp((o-p[k]).len()-r)<=0)
continue;
o = geto(p[i], p[j], p[k]);
r = (o-p[i]).len();
}
}
}
printf("%.10lf\n%.10lf %.10lf", r, o.x, o.y);
}