#include<bits/stdc++.h>
#define int long long
#define N 1010
using namespace std;
int n;
struct node{
double x, y;
int id;
}a[N];
double f[N][N][2];
struct lcc{
int L, R, o;
}pre[N][N][2];
double d(int aa, int bb) {
return (a[aa].x - a[bb].x) * (a[aa].x - a[bb].x) + (a[aa].y - a[bb].y) * (a[aa].y - a[bb].y);
}
void upd(double &x, double y, int L, int R, int now, int l, int r, int lst) {
if(x > y) {
x = y;
pre[L][R][now] = (lcc){l, r, lst};
}
}
bool cmp(node a, node b) {
if(a.x != b.x) return a.x < b.x;
else return a.y < b.y;
}
void dfs(int L, int R, int o) {
if(L == R) {
cout << a[L].id << " ";
return;
}
int l = pre[L][R][o].L, r = pre[L][R][o].R, O = pre[L][R][o].o;
if(L < l) {
dfs(l, r, O);
cout << a[L].id << " ";
}
else {
dfs(l, r, O);
cout << a[R].id << " ";
}
}
signed main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y;
a[i].id = i;
}
sort(a + 1, a + n + 1, cmp);
int s = 0;
double Max = -1e18;
for(int i = 1; i <= n; i++) {
if(a[i].y > Max) {
Max = a[i].y;
s = i;
}
}
for(int i = 0; i <= n + 1; i++)
for(int j = i; j <= n + 1; j++) f[i][j][0] = f[i][j][1] = 1e18;
f[s][s][0] = f[s][s][1] = 0;
for(int len = 1; len <= n; len++) {
for(int i = 1; i + len - 1 <= n; i++) {
int j = i + len - 1;
upd(f[i - 1][j][0], f[i][j][0] + d(i - 1, i), i - 1, j, 0, i, j, 0);
upd(f[i - 1][j][0], f[i][j][1] + d(i - 1, j), i - 1, j, 0, i, j, 1);
upd(f[i][j + 1][1], f[i][j][0] + d(i, j + 1), i, j + 1, 1, i, j, 0);
upd(f[i][j + 1][1], f[i][j][1] + d(j, j + 1), i, j + 1, 1, i, j, 1);
}
}
if(f[1][n][0] < f[1][n][1]) dfs(1, n, 0);
else dfs(1, n, 1);
return 0;
}