#include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<stdlib.h> #include<cmath> #include<queue> #include<algorithm> using namespace std; #define rd(x) scanf("%d",&x) #define rdd(x,y) scanf("%d%d",&x,&y) #define rddd(x,y,z) scanf("%d%d%d",&x,&y,&z) #define rds(s) scanf("%s",s) #define rep(i,n) for(int i=0;i<n;i++) #define LL long long const int N = 100; const int M=5e5+10; const int inf=1e9; const double eps=1e-5; const int MOD=1e9+7; int n,m; struct Point{ double x,y; Point(){ } Point(double _x,double _y){ x=_x;y=_y; } }; Point p1,p2,p3,p4; struct Seg{ Point s,e; Seg(){} Seg(Point _s,Point _e){ s=_s; e=_e; } Seg(double x,double y,double xx,double yy){ s.x=x;s.y=y; e.x=xx;e.y=yy; } }; double cross(Point a,Point b,Point c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } double dist(Point a,Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int sgn(double x){ return x<-eps?-1:x<eps?0:1;} bool jiao(Seg a,Seg b){ Point p1,p2,p3,p4; p1=a.s;p2=a.e; p3=b.s;p4=b.e; if(min(p1.x,p2.x)<=max(p3.x,p4.x) && min(p3.x,p4.x)<=max(p1.x,p2.x) && min(p1.y,p2.y)<=max(p3.y,p4.y) && min(p3.y,p4.y)<=max(p1.y,p2.y) && sgn(cross(p1,p2,p3))*sgn(cross(p1,p2,p4))<=0 && sgn(cross(p3,p4,p1))*sgn(cross(p3,p4,p2))<=0 ) return true; return false; } Seg seg[100005]; int dp[2][100005]; int main() { #ifndef ONLINE_JUDGE freopen("aaa","r",stdin); #endif int T; while(true){ rd(n); if(n==0) break; for(int i=1;i<=n;i++){ double u,v,w,z; scanf("%lf%lf%lf%lf",&u,&v,&w,&z); seg[i]=Seg(u,v,w,z); } int c=0; int cnt=0; for(int i=1;i<=n;i++){ int nxt=c^1; int cnt2=0; for(int j=0;j<cnt;j++){ if(jiao(seg[dp[c][j]],seg[i])) continue; dp[nxt][cnt2++]=dp[c][j]; } dp[nxt][cnt2++]=i; c^=1;cnt=cnt2; } printf("Top sticks: "); for(int i=0;i<cnt;i++){ printf("%d%s",dp[c][i],i==cnt-1?".\n":", "); } } return 0; }