#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e6;
struct EDGE{
int to,next;
}edge[MAXN];
int head[MAXN],d[MAXN],cnt;
double k[MAXN],b[MAXN];
int n,m;
int x[MAXN],y[MAXN],kx[MAXN],ky[MAXN];
void add(int u,int v){
d[v]++;
cnt++;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void get(int idx,int x,int y,int kx,int ky){
k[idx]=1.0*(ky-y)/(kx-x);
b[idx]=y-1.0*k[idx]*x;
}
double dis(int idx,int x_){
double y_=k[idx]*x_+b[idx];
if(y[idx]==ky[idx]) return y[idx];
if(x[idx]==kx[idx]) return min(y[idx],ky[idx]);
return y_;
}
void repeat(int p,int q){
if(x[p]>x[q]) swap(p,q);
if(kx[p]<x[q])
return ;
double y_=dis(p,x[q]);
if(y_<min(y[q],ky[q])) add(p,q);
else add(q,p);
}
queue<int> q;
void topo_sort(){
for(int i=1;i<=n;i++)
if(d[i]==0)
q.push(i);
while(!q.empty()){
int root=q.front();
cout<<root<<" ";
q.pop();
int cnt=0;
for(int i=head[root];i;i=edge[i].next){
int t=edge[i].to;
d[t]--;
if(!d[t])
q.push(t);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>kx[i]>>ky[i];
if(x[i]>kx[i])
swap(x[i],kx[i]),swap(y[i],ky[i]);
get(i,x[i],y[i],kx[i],ky[i]);
for(int j=1;j<i;j++)
repeat(i,j);
}
topo_sort();
return 0;
}