{$APPTYPE CONSOLE}
{$O-,Q+,R+}

uses Math, SysUtils;

type
  int = integer;
  bool = boolean;
  real = extended;
const
  eps = 1e-10;
  inf = 1e1000;

function bt( x, x0, x1 : real ) : bool;
begin
  bt := ((x >= x0 - eps) and (x <= x1 + eps)) or ((x >= x1 - eps) and (x <= x0 + eps)); 
end;


var
  dirx, diry, best, bestdirx, bestdiry, bestx, besty, cx, cy : real;

procedure trydir( dx, dy : real );
var dp, cp, ang : real;
begin
  if (abs(dx) <= eps) and (abs(dy) <= eps) then
    exit;
  dp := dirx * dx + diry * dy;
  cp := dirx * dy - diry * dx;
  ang := arctan2(cp, dp);
  if ang < eps then
    ang := ang + 2 * pi;
  if best > ang then
  begin
    best := ang;
    bestdirx := dx;
    bestdiry := dy;
  end;
end;

procedure trypoint( xx, yy : real );
var dp : real;
begin
  dp := (xx - cx) * dirx + (yy - cy) * diry;
  if dp > eps then
  begin
    if best > dp then
    begin
      best := dp;
      bestx := xx;
      besty := yy;
    end
  end;
end;

var
  n, i, j, np : int;
  x, y, a0, a1, a2, ux, uy : array[0..100000] of real;
  b0, b1, b2, c0, c1, c2 : real;
begin
  reset(input, 'find.in');
  rewrite(output, 'find.out');
  read(n);
  for i := 0 to n - 1 do
    read(x[i], y[i]);
  x[n] := x[0];
  y[n] := y[0];
  for i := 0 to n - 1 do
  begin
    a0[i] := x[i] * y[i + 1] - y[i] * x[i + 1];
    a1[i] := y[i] - y[i + 1];
    a2[i] := x[i + 1] - x[i];
  end;
  j := 0;
  for i := 1 to n - 1 do
    if (x[j] > x[i]) or ((x[j] = x[i]) and (y[j] > y[i])) then
      j := i;
  cx := x[j];
  cy := y[j];
  dirx := 0;
  diry := 1;
  np := 0;
  while true do
  begin
    best := inf;
    for i := 0 to n - 1 do
      if (abs(a0[i] + cx * a1[i] + cy * a2[i]) < eps)
         and bt(cx, x[i], x[i + 1]) and bt(cy, y[i], y[i + 1]) then
      begin
        trydir(x[i] - cx, y[i] - cy);
        trydir(x[i + 1] - cx, y[i + 1] - cy);
      end;
    assert(best <> inf);

    if abs(dirx * bestdiry - diry * bestdirx) > eps then
    begin
      ux[np] := cx;
      uy[np] := cy;
      inc(np);
    end;

    dirx := bestdirx;
    diry := bestdiry;
    b0 := cx * diry - cy * dirx;
    b1 := -diry;
    b2 := dirx;
    best := inf;
    for i := 0 to n - 1 do
    begin
      c0 := a1[i] * b2 - a2[i] * b1;
      c1 := a2[i] * b0 - a0[i] * b2;
      c2 := a0[i] * b1 - a1[i] * b0;
      if abs(c0) <= eps then
      begin
        if (abs(c1) <= eps) and (abs(c2) <= eps) then
        begin
          trypoint(x[i], y[i]);
          trypoint(x[i + 1], y[i + 1]);
        end;
      end
      else
        trypoint(c1 / c0, c2 / c0);
    end;
    assert(best <> inf);


    dirx := -dirx;
    diry := -diry;
    if (np > 1) and (abs(cx - ux[0]) <= eps) and (abs(cy - uy[0]) <= eps)
       and (abs(dirx * (uy[1] - uy[0]) - diry * (ux[1] - ux[0])) <= eps) then
      break;

    cx := bestx;
    cy := besty;

  end;
  dec(np);
  writeln(np);
  for i := 0 to np - 1 do
    writeln(ux[i] : 1 : 6, ' ', uy[i] : 1 : 6);
end.