#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+5;
int n,k;
double d[N][N][2],maxn=-1e9-5;
int num[N];
struct {
double x,y;
}a[N];
struct node{
int l,r,idx;
}fa[N][N][2];
node now;
double dist(int x,int y){
return sqrt(((a[x].x-a[y].x)*(a[x].x-a[y].x))+((a[x].y-a[y].y)*(a[x].y-a[y].y)));
}
int mod(int a){
if(a>n) return a%n;
else if(a<=0) return a+n;
else return a;
}
void work(){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++) d[i][j][0]=d[i][j][1]=1e17;
}
d[0][0][0]=d[0][0][1]=0;
for(int i=1;i<n;i++){
for(int l=0;l<=i;l++){
int r=i-l;
if(l && d[l][r][0]>d[l-1][r][0]+dist(mod(k+l),mod(k+l-1))) d[l][r][0]=d[l-1][r][0]+dist(mod(k+l),mod(k+l-1)),fa[l][r][0]=(node){l-1,r,0};
if(l && d[l][r][0]>d[l-1][r][1]+dist(mod(k+l),mod(k-r))) d[l][r][0]=d[l-1][r][1]+dist(mod(k+l),mod(k-r)),fa[l][r][0]=(node){l-1,r,1};
if(r && d[l][r][1]>d[l][r-1][0]+dist(mod(k-r),mod(k+l)))d[l][r][1]=d[l][r-1][0]+dist(mod(k-r),mod(k+l)),fa[l][r][1]=(node){l,r-1,0};
if(r && d[l][r][1]>d[l][r-1][1]+dist(mod(k-r),mod(k-r+1))) d[l][r][1]=d[l][r-1][1]+dist(mod(k-r),mod(k-r+1)),fa[l][r][1]=(node){l,r-1,1};
// cout<<l<<' '<<r<<' '<<d[l][r][0]<<' '<<d[l][r][1]<<endl;
}
}
// for(int i=1;i<n;i++){
// for(int l=0;l<=i;l++){
// int r=i-l;
// cout<<l<<' '<<r<<' '<<d[l][r][0]<<' '<<d[l][r][1]<<endl;
// }
// cout<<"~~~~~~~~~~~"<<endl;
// }
int ans=1e17;
for(int l=0;l<n;l++){
int r=n-l-1;
if(ans>d[l][r][0]){
ans=d[l][r][0];
now=(node){l,r,0};
}
if(ans>d[l][r][1]){
ans=d[l][r][1];
now=(node){l,r,1};
}
}
int i=0;
while(now.l || now.r){
i++;
if(now.idx) num[i]=mod(k-now.r);
else num[i]=mod(k+now.l);
now=fa[now.l][now.r][now.idx];
}
for(i;i;i--){
cout<<num[i]<<" ";
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
if(a[i].y>maxn) maxn=a[i].y,k=i;
}
cout<<k<<" ";
work();
return 0;
}
expected = 9995105.659828, found = 9995105.912659