#include <stdio.h>
#include <math.h>
double x[6005], y[6005], z[6005], r[3], a[8000], ax[8000], ay[8000];
double sqrt3_2=0.86602540378443864676372317075294, sqrt3;
int p[3005], pr[3005], n, t, b[25005], e[25005], kk, f[25005], m, next[25005], prev[25005], c[8000], g, mn;
int X[6005], Y[6005], d[3005], XX, YY;
void qsort(int l, int r)
{
int i=l, j=r, tt;
double x=a[(l+r)>>1], t;
while (i<=j)
{
while (a[i]>x) i++;
while (a[j]<x) j--;
if (i<=j)
{
t=a[i], a[i]=a[j], a[j]=t;
t=ax[i], ax[i]=ax[j], ax[j]=t;
t=ay[i], ay[i]=ay[j], ay[j]=t;
tt=c[i], c[i++]=c[j], c[j--]=tt;
}
}
if (l<j) qsort(l,j);
if (i<r) qsort(i,r);
}
double D(int i, int j)
{
double dx=x[i]-x[j], dy=y[i]-y[j];
return dx*dx+dy*dy;
}
int DD(int i, int j)
{
int dx=X[i]-X[j], dy=Y[i]-Y[j];
return dx*dx+dy*dy;
}
int DDD(int j)
{
int dx=XX-X[j], dy=YY-Y[j];
return dx*dx+dy*dy;
}
void rot(int i, int j, int k)
{
x[k]=x[i]+(x[j]-x[i])*0.5-(y[j]-y[i])*sqrt3;
y[k]=y[i]+(y[j]-y[i])*0.5+(x[j]-x[i])*sqrt3;
}
void add(int x, int y)
{
b[kk]=x;
e[kk]=y;
next[kk]=f[x];
prev[f[x]]=kk;
prev[kk]=-1;
f[x]=kk++;
}
void addd(int x, int y)
{
add(x,y);
add(y,x);
}
void del(int k)
{
if (prev[k]==-1) f[b[k]]=next[k];
else next[prev[k]]=next[k];
if (next[k]!=-1) prev[next[k]]=prev[k];
next[k]=f[b[k]];
b[k]=e[k]=-1;
}
void dell(int k)
{
del((k>>1)<<1);
del(((k>>1)<<1)+1);
}
int can(int j, int k)
{
int x1, y1, x2, y2;
double tt;
if (e[k]==b[j]) return 0;
x1=X[b[j]]-X[e[j]];
y1=Y[b[j]]-Y[e[j]];
x2=X[e[k]]-X[b[k]];
y2=Y[e[k]]-Y[b[k]];
tt=x1*x2+y1*y2;
if (tt>=0.0 || tt*tt<0.1*DD(b[j],e[j])*DD(b[k],e[k]))
{
if (x1*y2<x2*y1) return 1;
else return -1;
}
else return 0;
}
void getpoint(int j, int k, int s)
{
double x1, y1, z1, x2, y2, z2;
int ii, jj;
sqrt3=s*sqrt3_2;
rot(b[j],e[k],n+m+1);
rot(e[k],e[j],n+m+2);
ii=e[j], jj=n+m+1;
x1=y[ii]-y[jj];
y1=x[jj]-x[ii];
z1=x[ii]*y[jj]-x[jj]*y[ii];
ii=b[j], jj=n+m+2;
x2=y[ii]-y[jj];
y2=x[jj]-x[ii];
z2=x[ii]*y[jj]-x[jj]*y[ii];
x[mn]=y1*z2-y2*z1;
y[mn]=x2*z1-x1*z2;
z1=x1*y2-x2*y1;
x[mn]/=z1;
y[mn]/=z1;
}
void addpoint(int j, int k, int i)
{
// a[g]=D(b[j],e[j])+D(b[k],e[k])-D(b[j],i)-D(b[k],i)-D(e[k],i);
a[g]=sqrt(D(b[j],e[j]))+sqrt(D(b[k],e[k]))-sqrt(D(b[j],i))-sqrt(D(b[k],i))-sqrt(D(e[k],i));
ax[g]=x[i];
ay[g]=y[i];
c[g++]=k+(j<<13);
}
void out(void)
{
int i, t;
for (i=
0; i<m; i++
) printf("%.15lf %.15lf\n", x
[n+i
], y
[n+i
]);
for (i=0; i<m+n; i++)
for (t=f[i]; t!=-1; t=next[t])
if (b
[t
]<e
[t
]) printf("%d %d\n", b
[t
], e
[t
]);
}
int main(void)
{
int i, j, k, tn, nt, min, s, tt, dmin;
int *dd;
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
for (tn=0; tn<nt; tn++)
{
m=kk=0, mn=n;
for (i=0; i<n; i++)
scanf("%lf%lf", &x
[i
], &y
[i
]), f
[i
]=-
1, X
[i
]=x
[i
]+
0.
5, Y
[i
]=y
[i
]+
0.
5;
for (i=1; i<n; i++)
d[i-1]=1000000000, p[i-1]=i;
t=n-1;
j=0;
while (t>0)
{
XX=X[j], YY=Y[j];
for (min=i=0, dd=d, dmin=*dd; i<t; i++, dd++)
{
if ((tt=DDD(p[i]))<*dd) *dd=tt, pr[i]=j;
if (*dd<dmin) min=i, dmin=*dd;
}
addd(pr[min], p[min]);
j=p[min];
t--;
p[min]=p[t];
d[min]=d[t];
pr[min]=pr[t];
}
for (g=i=0; i<n; i++)
for (j=f[i]; j!=-1; j=next[j])
for (k=f[e[j]]; k!=-1; k=next[k])
if (j<k && (s=can(j,k)))
{
getpoint(j, k, s);
addpoint(j, k, n);
}
qsort(0, g-1);
for (i=0; i<g && m<n; i++)
{
j=c[i];
k=j&8191;
j>>=13;
if (b[j]>=0 && b[k]>=0)
{
// getpoint(j, k, can(j,k));
x[mn]=ax[i];
y[mn]=ay[i];
f[mn]=-1;
addd(b[j],mn);
addd(b[k],mn);
addd(e[k],mn);
dell(j);
dell(k);
m++;
mn++;
}
}
/* for (i=0; i<m+n && m<n; i++)
for (j=f[i]; j!=-1 && m<n; j=next[j])
{
for (k=f[e[j]]; k!=-1; k=next[k])
if (s=can(j,k)) break;
if (k!=-1)
{
getpoint(j, k, s);
f[m+n]=-1;
addd(i,mn);
addd(b[k],mn);
addd(e[k],mn);
dell(j);
dell(k);
m++;
mn++;
}
}*/
out();
}
return 0;
}