program f;

{$APPTYPE CONSOLE}
{$R+,Q+,S+,H+}

uses
  Math,
  SysUtils;

Type
  Integer=LongInt;
  Real=Extended;

Const
  TaskID='find';
  InFile=TaskID+'.in';
  OutFile=TaskID+'.out';
  MaxN=102;
  MaxS=2*MaxN*MaxN;
  Eps=1e-10;

Type
  TPoint=Record
    X,Y:Real;
  End;
  TSegm=Record
    P1,P2:TPoint;
  End;
  TLine=Record
    A,B,C:Real;
  End;

Var
  N:Integer;
  P:Array[1..MaxN]Of TPoint;
  NS:Integer;
  S:Array[1..MaxS]Of TSegm;
  CNP:Integer;
  CP:Array[1..2*MaxN]Of TPoint;
  CVal:Array[1..2*MaxN]Of Real;
  M,ResM:Integer;
  Res:Array[1..MaxS]Of TPoint;
  Take:Array[1..MaxS]Of Boolean;

Procedure Load;
Var
  I:Integer;
Begin
  ReSet(Input,InFile);
  Close(Input);
  Read(N);
  For I:=1 To N Do With P[I] Do Read(X,Y);
End;

Procedure MakeLine(P1,P2:TPoint; Out L:TLine);
Var
  Z:Real;
Begin
  L.A:=P1.Y-P2.Y;
  L.B:=P2.X-P1.X;
  Z:=Sqrt(Sqr(L.A)+Sqr(L.B));
  If Abs(Z)>Eps Then Begin
    L.A:=L.A/Z;
    L.B:=L.B/Z;
  End;
  L.C:=-(L.A*P1.X+L.B*P1.Y);
End;

Function Side(L:TLine; P:TPoint):Integer;
Var
  Z:Real;
Begin
  Z:=L.A*P.X+L.B*P.Y+L.C;
  If Abs(Z)<Eps Then Side:=0 Else If Z<0 Then Side:=-1 Else Side:=1;
End;

Function Cross(P1,P2,Q1,Q2:TPoint; Out R:TPoint):Boolean;
Var
  I:Integer;
  LP,LQ:TLine;
  SP1,SP2,SQ1,SQ2:Integer;
  Z:Real;
Begin
  Cross:=False;
  MakeLine(P1,P2,LP);
  MakeLine(Q1,Q2,LQ);
  SP1:=Side(LQ,P1);
  SP2:=Side(LQ,P2);
  SQ1:=Side(LP,Q1);
  SQ2:=Side(LP,Q2);
  If (SP1=0) And (SP2=0) Then Exit;
  If (SQ1=0) And (SQ2=0) Then Exit;
  If (SP1>0) And (SP2>0) Then Exit;
  If (SP1<0) And (SP2<0) Then Exit;
  If (SQ1>0) And (SQ2>0) Then Exit;
  If (SQ1<0) And (SQ2<0) Then Exit;
  Z:=LP.A*LQ.B-LP.B*LQ.A;
  If Abs(Z)<Eps Then Exit;
  R.X:=-(LP.C*LQ.B-LP.B*LQ.C)/Z;
  R.Y:=-(LP.A*LQ.C-LP.C*LQ.A)/Z;
  Cross:=True;
End;

Function Less(A,B:TSegm):Boolean;
Begin
  Less:=(A.P1.X<B.P1.X-Eps) Or (A.P1.X<B.P1.X+Eps) And (A.P1.Y<B.P1.Y-Eps);
End;

Procedure QSort(L,R:Integer);
Var
  I,J:Integer;
  X,Y:TSegm;
Begin
  I:=L;
  J:=R;
  X:=S[L+Random(R-L+1)];
  While I<=J Do Begin
    While Less(S[I],X) Do Inc(I);
    While Less(X,S[J]) Do Dec(J);
    If I<=J Then Begin
      Y:=S[I];
      S[I]:=S[J];
      S[J]:=Y;
      Inc(I);
      Dec(J);
    End;
  End;
  If I<R Then QSort(I,R);
  If L<J Then QSort(L,J);
End;

Function Compare(A,B:TPoint):Integer;
Begin
  If A.X<B.X-Eps Then Compare:=-1 Else If A.X>B.X+Eps Then Compare:=1 Else
    If A.Y<B.Y-Eps Then Compare:=-1 Else If A.Y>B.Y+Eps Then Compare:=1 Else Compare:=0;
End;

Function BSearch(P:TPoint):Integer;
Var
  L,R,M:Integer;
Begin
  L:=0;
  R:=NS+1;
  While R-L>1 Do Begin
    M:=(L+R) Div 2;
    Case Compare(S[M].P1,P) Of
      -1:L:=M;
      0,1:R:=M;
    End;
  End;
  BSearch:=R;
End;

Procedure Solve;
Var
  I,II,III,J,JJ,At:Integer;
  SP,PP:TPoint;
  Tmp:Real;
  DX1,DY1,DX2,DY2,Min,ADir,CDir,Cur,C2:Real;
  MinAt,Last:Integer;
Begin
  NS:=0;
  For I:=1 To N Do Begin
    II:=I Mod N+1;
    CNP:=2;
    CP[1]:=P[I];
    CP[2]:=P[II];
    For J:=1 To N Do If (J<>I) And (I Mod N+1<>J) And (J Mod N+1<>I) Then Begin
      JJ:=J Mod N+1;
      If Cross(P[I],P[II],P[J],P[JJ],PP) Then Begin
        Inc(CNP);
        CP[CNP]:=PP;
      End;
    End;
    For J:=1 To CNP Do Begin
      CVal[J]:=CP[J].X*0.543715431463+CP[J].Y*0.957341965343;
    End;
    For J:=1 To CNP Do
      For JJ:=CNP DownTo J+1 Do
        If CVal[JJ-1]>CVal[JJ] Then Begin
          Tmp:=CVal[JJ-1];
          CVal[JJ-1]:=CVal[JJ];
          CVal[JJ]:=Tmp;
          PP:=CP[JJ-1];
          CP[JJ-1]:=CP[JJ];
          CP[JJ]:=PP;
        End;
    For J:=2 To CNP Do If (Abs(CP[J-1].X-CP[J].X)>Eps) Or (Abs(CP[J-1].Y-CP[J].Y)>Eps) Then Begin
      Inc(NS);
      S[NS].P1:=CP[J-1];
      S[NS].P2:=CP[J];
      Inc(NS);
      S[NS].P1:=CP[J];
      S[NS].P2:=CP[J-1];
    End;
  End;
  M:=0;
  QSort(1,NS);
  PP.X:=1e100;
  PP.Y:=1e100;
  For I:=1 To N Do Begin
    If (P[I].X<PP.X-Eps) Or (P[I].X<PP.X+Eps) And (P[I].Y<PP.Y-Eps) Then PP:=P[I];
  End;
  CDir:=Pi;
  SP:=PP;
  Repeat
    Inc(M);
    Res[M]:=PP;
    At:=BSearch(PP);
    Min:=1e100;
    MinAt:=0;
    While (At<=NS) And (Compare(S[At].P1,PP)=0) Do Begin
      ADir:=ArcTan2(S[At].P2.Y-PP.Y,S[At].P2.X-PP.X)-CDir;
      While ADir<Eps Do ADir:=ADir+2*Pi;
      While ADir>2*Pi+Eps Do ADir:=ADir-2*Pi;
      If (ADir<Min) Then Begin
        Min:=ADir;
        MinAt:=At;
      End;
      Inc(At);
    End;
    CDir:=Min+CDir-Pi;
    PP:=S[MinAt].P2;
  Until (Abs(PP.X-SP.X)<Eps) And (Abs(PP.Y-SP.Y)<Eps);
  FillChar(Take,SizeOf(Take),True);
  Last:=1;
  ResM:=M;
  For I:=1 To M-1 Do Begin
    II:=I Mod M+1;
    III:=II Mod M+1;
    DX1:=Res[II].X-Res[Last].X;
    DY1:=Res[II].Y-Res[Last].Y;
    DX2:=Res[III].X-Res[II].X;
    DY2:=Res[III].Y-Res[II].Y;
    If Abs(DX1*DY2-DX2*DY1)<Eps Then Begin
      Take[II]:=False;
      Dec(ResM);
    End Else Last:=II;
  End;
End;

Procedure Save;
Var
  I:Integer;
Begin
  ReWrite(Output,OutFile);
  WriteLn(ResM);
  For I:=1 To M Do If Take[I] Then WriteLn(Res[I].X:0:10,' ',Res[I].Y:0:10);
  Close(Output);
End;

begin
  RandSeed:=543781275;
  Load;
  Solve;
  Save;
end.
