#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x])
using namespace std;
const int N=1e3+10,M=4e7+10,V=50;
int n;
bool p[V];
int a[V],q[V],pre[1<<24],res[1<<24];
double ans=1e12;
double f[1<<24],x[N],y[N];
double d[N][N];
int fr()
{
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
void fw(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) fw(x/10);
putchar(x%10+'0');
}
double dis(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
void dfs(int x,double val,int lt)
{
if(val>=ans) return;
if(x>=n+1)
{
ans=val;
memcpy(q,a,sizeof a);
}
for(int i=0;i<n;i++)
{
if(!p[i])
{
p[i]=1;
a[x]=i+1;
dfs(x+1,val+d[i][lt],i);
a[x]=0;
p[i]=0;
}
}
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
n=fr();
int st=n+5;
y[st]=-1e7;
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
if(y[st]<y[i]) st=i;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]=dis(i,j);
if(n<=9)
{
p[st]=1;
dfs(2,0,st);
q[1]=st+1;
for(int i=1;i<=n;i++) fw(q[i]),pt;
}
else if(n<=27)
{
for(int i=0;i<=(1<<n)-1;i++) f[i]=1e12;
f[1<<st]=0;
pre[1<<st]=0;
for(int i=(1<<st);i<=(1<<n)-1;i++)
{
for(int j=0;j<n;j++)
{
if(!((i>>j)&1))
{
for(int k=0;k<n;k++)
{
if((i>>k)&1)
{
if(f[i+(1<<j)]>f[i]+d[k][j])
{
pre[i+(1<<j)]=i;
f[i+(1<<j)]=f[i]+d[k][j];
}
}
}
}
}
}
int x=(1<<n)-1,idx=0;
while(x)
{
res[++idx]=x;
x=pre[x];
}
reverse(res+1,res+1+idx);
for(int i=1;i<=n;i++)
{
int s=res[i];
for(int j=0;j<n;j++)
{
if(!p[j] && (s>>j)&1)
{
p[j]=1;
fw(j+1),pt;
}
}
}
}
else
{
fw(st),pt;
for(int i=1;i<=n;i++) if(i!=st) fw(i),pt;
}
return 0;
}