/*題意:從最低的點開始,不能向右拐,問能經過多少點?能定是經過所有點了 從最低點開始,求與其極角最小的點,作為新的起點,在需找與這個點成極角最小的點,依次即可*/#include<stdio.h>#include<stdlib.h>struct point {int x,y,n;}dian[60];int n;int dis(point a,point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}int cross(point p,point s,point e){return (e.x-s.x)*(p.y-s.y)-(p.x-s.x)*(e.y-s.y);}int cmp(const void *a,const void *b,int zhu){int ret;point *c=(point*)a,*d=(point*)b;ret=cross(*d,dian[zhu],*c);if(ret!=0) return -ret;else if(dis(*c,dian[zhu])>dis(*d,dian[zhu]))return 1;else return 0;}int pro(int i){int bao=i;int a=i;for(i=i+1;i<=n;++i){if(cmp(&dian[a],&dian[i],bao-1)>0)a=i;}return a;}int main(){int t,i,l,a;scanf("%d",&t);while(t--){l=-1;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d%d",&a,&dian[i].x,&dian[i].y);dian[i].n=i;if(l==-1||(dian[i].y<dian[l].y)||((dian[l].x>dian[i].x)&&(dian[l].y==dian[i].y)))l=i;}dian[n+1]=dian[l];dian[l]=dian[1];dian[1]=dian[n+1];dian[0].x=0,dian[0].y=dian[1].y;for(i=2;i<n;i++){a=pro(i);dian[n+1]=dian[i];dian[i]=dian[a];dian[a]=dian[n+1];}printf("%d",n);for(i=1;i<=n;++i)printf(" %d",dian[i].n);printf("\n");}return 0;}