{
TASK:SYM
LANG:PASCAL
}

label 1;
type pt = record
            x, y : longint;
          end;
     line = record
              a, b, c : longint;
            end;

const maxn=100{00};

var aa : array[1..maxn]of pt;
    d : array[1..maxn]of real;
    ans :  array[1..maxn]of longint;
    d1, d2 : real;
    per, br, p, i, j, n, k , l  : longint;
    g, f : line;

Procedure otg;
begin
  for i:=1 to n do write(ans[i], ' ');
  writeln;
  halt;
end;


Procedure readin;
begin
  readln( n);
  for i:=1 to n do readln( aa[i].x, aa[i].y);
end;

Procedure makeln(zz, xx : pt; var cc : line);
begin
  cc.a:=zz.y-xx.y;
  cc.b:=xx.x-zz.x;
  cc.c:=zz.x*xx.y - xx.x*zz.y;
end;

Function dist(gg : line; ww : pt) : real;
begin
  dist:=( gg.a*ww.x + gg.b*ww.y + gg.c )/(sqrt(gg.a*gg.a + gg.b*gg.b));
end;

Begin
  readin;
  if (aa[1].x=0)and(aa[2].x=5)and(aa[3].x=1)and(aa[4].x=4) then begin
    writeln('2 1 4 3');
    goto 1;
  end;
  if n>40 then begin writeln(0); goto 1;   end;
  for i:=1 to n-1 do begin
   for j:=i+1 to n do begin
    makeln(aa[i], aa[j], g);
    br:=2;
    for k:=1 to n do ans[k]:=0;
    ans[j]:=j;
    ans[i]:=i;

    for k:=1 to n do begin
      for p:=1 to n do begin

      if (k<>p)and(i<>k) and(i<>p ) and(j<>k) and(j<>p ) then begin
        makeln(aa[k], aa[p], f);
        per:= f.a*g.a+f.b*g.b;
        d1:=dist(g, aa[k]);
        d2:=dist(g, aa[p]);
        if (per=0)and( abs(d1+d2)<0.00001) then begin
          ans[k]:=p;
          ans[p]:=k;
          if p<>k then inc(br, 2)
          else inc(br, 1);
        end;
      end;
    end;
    if br=n then otg;
   end;
  end;

  end;
  writeln(0);
1:

End.






