#include <iostream>
#include <deque>
#include <cstring>
#include <algorithm>
#define ABS(i) ((i) > 0 ? (i) : -(i))
usingnamespacestd;classAtom{public:intx,y;intdir;intenergy;Atom(inta,intb,intd,inte){x=a;y=b;dir=d;energy=e;}};classCollision{public:intatom1,atom2;intenergy;floattime;Collision(inta,intb,inte,floatt){atom1=a;atom2=b;energy=e;time=t;}};boolcompare(Collisionc1,Collisionc2){returnc1.time<c2.time;}deque<Atom>atoms;deque<Collision>collisions;intN;// 원자수intdir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};// 상0, 하1, 좌2, 우3intflag[1000];floatisCollide(Atoma1,Atoma2){intx_diff=a1.x-a2.x;inty_diff=a1.y-a2.y;floattime=(ABS(x_diff)+ABS(y_diff))/2.0;if(x_diff==0&&a1.dir<2){// 동일한 x 선상에 있고 위 또는 아래를 향할 때if(a1.dir==0&&a2.dir==1&&y_diff<0)// 위를 향하고 a2가 더 위에 있을 때returntime;elseif(a1.dir==1&&a2.dir==0&&y_diff>0)returntime;}elseif(y_diff==0&&a1.dir>=2){// 동일한 y 선상에 있고 좌 또는 우를 향할 때 if(a1.dir==2&&a2.dir==3&&x_diff>0)returntime;elseif(a1.dir==3&&a2.dir==2&&x_diff<0)returntime;}elseif(ABS(x_diff)==ABS(y_diff)){if(a1.dir==2||a1.dir==3){// y_diff < 0 : a1이 아래에 있을 때 , x_diff < 0 : a1이 왼쪽에 있을 때if((a1.dir==2&&a2.dir==1&&x_diff>0&&y_diff<0)// a1이 오른쪽 아래일 때||(a1.dir==2&&a2.dir==0&&x_diff>0&&y_diff>0)// a1이 오른쪽 위일 때)||(a1.dir==3&&a2.dir==0&&x_diff<0&&y_diff>0)// a1이 왼쪽 위일 때||(a1.dir==3&&a2.dir==1&&x_diff<0&&y_diff<0))// a1이 왼쪽 아래일 때returntime;}elseif(a1.dir==0||a1.dir==1){if((a1.dir==0&&a2.dir==3&&x_diff>0&&y_diff<0)// a1이 오른쪽 아래일 때 ||(a1.dir==0&&a2.dir==2&&x_diff<0&&y_diff<0)// a1이 왼쪽 아래일 때||(a1.dir==1&&a2.dir==3&&x_diff>0&&y_diff>0)// a1이 오른쪽 위일 때||(a1.dir==1&&a2.dir==2&&x_diff<0&&y_diff>0))// a1이 왼쪽 위일 때)returntime;}}return0.0;}voidget_input(){atoms.clear();collisions.clear();memset(flag,0,sizeof(flag));intx,y,d,k;cin>>N;for(inti=0;i<N;i++){cin>>x>>y>>d>>k;atoms.push_back(Atom(x,y,d,k));}}intsolve(){for(inti=0;i<atoms.size();i++){for(intj=0;j<atoms.size();j++){if(i==j)continue;floatt=isCollide(atoms[i],atoms[j]);if(t!=0.0){collisions.push_back(Collision(i,j,atoms[i].energy+atoms[j].energy,t));}}}inte=0;sort(collisions.begin(),collisions.end(),compare);deque<Collision>temp;deque<Collision>temp2;while(!collisions.empty()){temp.clear();temp2.clear();floatt=collisions[0].time;while(collisions.size()!=0&&collisions.at(0).time==t){temp.push_back(collisions[0]);collisions.pop_front();}for(inti=0;i<temp.size();i++){if(flag[temp[i].atom1]==0&&flag[temp[i].atom2]==0){temp2.push_back(temp[i]);}}for(inti=0;i<temp2.size();i++){flag[temp2[i].atom1]=1;flag[temp2[i].atom2]=1;}}for(inti=0;i<N;i++){if(flag[i]==1)e+=atoms[i].energy;}returne;}intmain(){intsol[50]={0,};intntest;cin>>ntest;for(inti=0;i<ntest;i++){get_input();sol[i]=solve();}for(inti=0;i<ntest;i++)cout<<"#"<<i+1<<" "<<sol[i]<<endl;}