//
http://www.spoj.com/problems/SBANK/
#include <cassert>//c headers in c++
#include <cctype>
#include <cfloat>
#include <cmath>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <algorithm>//c++ headers
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <iomanip>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <valarray>
#include <vector>
using namespace std;
/*START OF TEMPLATE:*/
#define INF
2000000000//::INF
#define VAR(x,a)
__typeof(a) x=(a)//::VAR(
#define FE(it,c)
for(VAR(it,(c).begin());it!=(c).end();++it)//::FE(
#define FOR(i,a,b)
for(int i=(int)(a),_b=(int)(b) ; i < _b;++i)//::FOR(
#define FORR(i,a,b)
for(int i=(a),_b=(b);i>=_b;--i)//::FORR(
#define
REP(i,n)
FOR(i,0,n)//::REP(
#define ALL(c)
(c).begin(),(c).end()//::ALL(
#define SZ(c)
(int)(c).size()//::SZ(
#define PB push_back//::PB
#define PF push_front//::PF
#define V(x) vector< x >//::V(
#define VI V(int)//::VI
#define VVI V(VI)//::VII
#define VS V(string)//::VS
#define PI pair< int,int >//::PI
#define MP make_pair//::MP
#define pi 3.14159265358979323846//::pi
const double eps=1e-11;//::eps
typedef long long LL;//::LL
typedef unsigned long long ULL;//::ULL
typedef long double LD;//::LD
/* Bitmasking Common Operator Follows */
#define two(X) (1<<(X))//::two(
#define twoL(X) (((LL)1)<<(X))//::twoL(
#define setBit(S,X) (S|=two(X))//::setBit(
#define setBitL(S,X) (S|=twoL(X))//::setBit(
#define contain(S,X) ((S&two(X))>0)//::contain(
#define containL(S,X) ((S&twoL(X))>0)//::containL(
template<class T> inline T lowbit(T n){return (n^(n-1))&n;}//::lowbit(
template<class T> inline int countbit(T n){return (n==0)?0:(1+countbit(n&(n-1)));}//::countbit(
template<class T> inline T sqr(T x){return x*x;}//::sqr
/* Numeric Function */
template<class T> inline T gcd(T a,T b)//::gcd(
{if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);while (b > 0){a = a % b;a ^= b;b ^= a; a ^= b; } return a;}
template<class T> inline T lcm(T a,T b)//::lcm(
{if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
template<class T> inline bool isPrime(T n)//::isPrime(
{if(n<=1)return false;for (T i=2;i*i<=n;i++) if (n%i==0) return false;return true;}
template<class T> inline T euclide(T a,T b,T &x,T &y)//::euclide(
{if(a<0){T d=euclide(-a,b,x,y);x=-x;return d;}
if(b<0){T d=euclide(a,-b,x,y);y=-y;return d;}
if(b==0){x=1;y=0;return a;}else{T d=euclide(b,a%b,x,y);T t=x;x=y;y=t-(a/b)*y;return d;}}
template<class T> inline vector<pair<T,int> > factorize(T n)//::factorize(
{vector<pair<T,int> > R;for (T i=2;n>1;){if (n%i==0){int C=0;for (;n%i==0;C++,n/=i);R.push_back(make_pair(i,C));}
i++;if (i>n/i) i=n;}if (n>1) R.push_back(make_pair(n,1));return R;}
template<class T> inline T eularFunction(T n)//::eularFunction(
{vector<pair<T,int> > R=factorize(n);T r=n;for (int i=0;i<R.size();i++)r=r/R[i].first*(R[i].first-1);return r;}
/* Mathematics Fraction Class */
template<class T> struct Fraction{T a,b;Fraction(T a=0,T b=1);string toString();};//::Fraction
template<class T> Fraction<T>::Fraction(T a,T b){T d=gcd(a,b);a/=d;b/=d;if (b<0) a=-a,b=-b;this->a=a;this->b=b;}
template<class T> string Fraction<T>::toString(){ostringstream sout;sout<<a<<"/"<<b;return sout.str();}
template<class T> Fraction<T> operator+(Fraction<T> p,Fraction<T> q){return Fraction<T>(p.a*q.b+q.a*p.b,p.b*q.b);}
template<class T> Fraction<T> operator-(Fraction<T> p,Fraction<T> q){return Fraction<T>(p.a*q.b-q.a*p.b,p.b*q.b);}
template<class T> Fraction<T> operator*(Fraction<T> p,Fraction<T> q){return Fraction<T>(p.a*q.a,p.b*q.b);}
template<class T> Fraction<T> operator/(Fraction<T> p,Fraction<T> q){return Fraction<T>(p.a*q.b,p.b*q.a);}
/*Matrix Operations*/
const int MaxMatrixSize=40;//::MaxMatrixSize
template<class T> inline void showMatrix(int n,T A[MaxMatrixSize][MaxMatrixSize])//::showMatrix(
{for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<A[i][j];cout<<endl;}}
template<class T> inline T checkMod(T n,T m) {return (n%m+m)%m;}//::checkMod(
template<class T> inline void identityMatrix(int n,T A[MaxMatrixSize][MaxMatrixSize])//::identityMatrix(
{for(int i=0;i<n;i++)for(int j=0;j<n;j++) A[i][j]=(i==j)?1:0;}
template<class T> inline void addMatrix(int n,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize])//::addMatrix(
{for(int i=0;i<n;i++) for(int j=0;j<n;j++) C[i][j]=A[i][j]+B[i][j];}
template<class T> inline void subMatrix(int n,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize])//::subMatrix(
{for(int i=0;i<n;i++) for(int j=0;j<n;j++) C[i][j]=A[i][j]-B[i][j];}
template<class T> inline void mulMatrix(int n,T C[MaxMatrixSize][MaxMatrixSize],T _A[MaxMatrixSize][MaxMatrixSize],T _B[MaxMatrixSize][MaxMatrixSize])//::mulMatrix(
{ T A[MaxMatrixSize][MaxMatrixSize],B[MaxMatrixSize][MaxMatrixSize];
for(int i=0;i<n;i++) for(int j=0;j<n;j++) A[i][j]=_A[i][j],B[i][j]=_B[i][j],C[i][j]=0;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) C[i][j]+=A[i][k]*B[k][j];}
template<class T> inline void addModMatrix(int n,T m,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize])//::addModMatrix(
{for(int i=0;i<n;i++) for(int j=0;j<n;j++) C[i][j]=checkMod(A[i][j]+B[i][j],m);}
template<class T> inline void subModMatrix(int n,T m,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize])//::subModMatrix(
{for(int i=0;i<n;i++) for(int j=0;j<n;j++) C[i][j]=checkMod(A[i][j]-B[i][j],m);}
template<class T> inline T multiplyMod(T a,T b,T m) {return (T)((((LL)(a)*(LL)(b)%(LL)(m))+(LL)(m))%(LL)(m));}//::multiplyMod(
template<class T> inline void mulModMatrix(int n,T m,T C[MaxMatrixSize][MaxMatrixSize],T _A[MaxMatrixSize][MaxMatrixSize],T _B[MaxMatrixSize][MaxMatrixSize])//::mulModMatrix(
{ T A[MaxMatrixSize][MaxMatrixSize],B[MaxMatrixSize][MaxMatrixSize];
for(int i=0;i<n;i++) for(int j=0;j<n;j++) A[i][j]=_A[i][j],B[i][j]=_B[i][j],C[i][j]=0;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) C[i][j]=(C[i][j]+multiplyMod(A[i][k],B[k][j],m))%m;}
template<class T> inline T powerMod(T p,int e,T m)//::powerMod(
{if(e==0)return 1%m;else if(e%2==0){T t=powerMod(p,e/2,m);return multiplyMod(t,t,m);}else return multiplyMod(powerMod(p,e-1,m),p,m);}
/*Point&Line*/
double dist(double x1,double y1,double x2,double y2){return sqrt(sqr(x1-x2)+sqr(y1-y2));}//::dist(
double distS(double x1,double y1,double x2,double y2){return sqr(x1-x2)+sqr(y1-y2);}//::distS(
template<class T> T cross(T x0,T y0,T x1,T y1,T x2,T y2){return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);}//::cross(
int crossOper(double x0,double y0,double x1,double y1,double x2,double y2)//::crossOper(
{double t=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);if (fabs(t)<=eps) return 0;return (t<0)?-1:1;}
bool isIntersect(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)//::isIntersect(
{return crossOper(x1,y1,x2,y2,x3,y3)*crossOper(x1,y1,x2,y2,x4,y4)<0 && crossOper(x3,y3,x4,y4,x1,y1)*crossOper(x3,y3,x4,y4,x2,y2)<0;}
bool isMiddle(double s,double m,double t){return fabs(s-m)<=eps || fabs(t-m)<=eps || (s<m)!=(t<m);}//::isMiddle(
/* Most Common Coversion */
template<class T> int toInt(T n){int r=0;istringstream ist(n);ist>>r;return r;}//::toInt(
template<class T> long long toLong(T n){istringstream ist(n);long long r;ist>>r;return r;}//::toLL(
template<class T> string toString(T n){stringstream ost;ost<<n;ost.flush();return ost.str();}//::toString(
template<class T> long double toDouble(T n){long double r=0;istringstream sin(n);sin>>r;return r;}//::toDouble(
template<class T> void stoa(string s,int &n,T A[]){n=0;istringstream sin(s);for(T v;sin>>v;A[n++]=v);}//::stoa(
template<class T> void atos(int n,T A[],string &s){ostringstream sout;for(int i=0;i<n;i++){if(i>0)sout<<' ';sout<<A[i];}s=sout.str();}//::atos(
template<class T> void atov(int n,T A[],vector<T> &vi){vi.clear();for (int i=0;i<n;i++) vi.push_back(A[i]);}//::atov(
template<class T> void vtoa(vector<T> vi,int &n,T A[]){n=vi.size();for (int i=0;i<n;i++)A[i]=vi[i];}//::vtoa(
template<class T> void stov(string s,vector<T> &vi){vi.clear();istringstream sin(s);for(T v;sin>>v;vi.push_back(v));}//::stov(
template<class T> void vtos(vector<T> vi,string &s){ostringstream sout;int a=vi.size();for (int i=0;i<a;i++){if(i>0)sout<<' ';sout<<vi[i];}s=sout.str();}//::vtos(
/* Input Output Function */
#define INPUT fread(IBUF, 1, BUFSIZE, stdin);
#define BUFSIZE (1<<26)
char IBUF[BUFSIZE+1], *inputptr=IBUF, OBUF[BUFSIZE+1], *outputptr=OBUF, DIP[20];
#define DIG(a) (((a)>='0')&&((a)<='9'))//::DIG(
#define getChar(t) {t=*inputptr++;}//::getChar(
template<class T>inline bool getInt(T &j) {j=0;int _t;getChar(_t);if(_t==0)return false;char sign;while(!DIG(_t)&&_t!=0){sign=_t;getChar(_t);}while(DIG(_t)){j=10*j+(_t-'0');getChar(_t);}if(sign == '-') j = -j;*inputptr--;return j==0&&_t==0?false:true;}//::getInt(
inline bool getString(char *s) {char _c;getChar(_c);if(_c==0)return false;while(_c==10||_c==32)getChar(_c);while(_c != 10&&_c != 32&&_c!=0){*s++=_c;getChar(_c)}*s=0;inputptr--;return s[0]==0&&_c==0?false:true;}
template<class T> inline void putInt(T x, char n=0) {int y, dig=0;while(x){y=x%10;DIP[dig++]=y+'0';x/=10;}while (dig--) *outputptr++=DIP[dig];n?*outputptr++=n:0;}
template<class T> inline void putString(T *s, char n=0){while(*s)*outputptr++=*s++;n?*outputptr++=n:0;}
#define putLine() {*outputptr++=10;}
#define OUTPUT fputs(OBUF, stdout);
/* Only for Debugging */
#define out(__debug) cout << #__debug<< "=" <<__debug << endl;//::out(
template<class T> void outC(T A)//::outContainer
{cout<<"{"; FE(it,A)cout << *it << " " ;cout<<"}"<<endl;}
template<class T> void outA(T A[],int n)//::outArray
{ cout<<"{"; for (int i=0;i<n;i++) cout<<A[i]<<" "; cout<<"}"<<endl;}
template<class T> void outV(vector<T> A,int n=-1)//::outVector
{ if (n<0) n=SZ(A); cout<<"{"; for (int i=0;i<n;i++) cout<<A[i]<<" "; cout<<"}"<<endl;}
template<class T> static void split(const string &s, vector<T> &out)//::split(
{istringstream in(s);out.clear();copy(istream_iterator<T>(in), istream_iterator<T>(), back_inserter(out));}
/*END TEMPLATE:BY_PANKAJ_CODEGAMBLER*/
int main()
{
//
freopen("SBANK.cppin","r",stdin);
INPUT;
int T;
getInt(T);
while(T--){
int n;//scanf("%d", &n);
getInt(n);
map<string, int> res;
char c1[30], c2[30], c3[50], c4[50], c5[50], c6[50];
REP(i, n){
getString(c1);getString(c2);getString(c3);getString(c4);getString(c5);getString(c6);
char s[30];s[0] = 0;
strcat(s, strcat(c1, strcat(c2, strcat(c3, strcat(c4, strcat(c5, c6))))));
//
res.insert(MP(s, 0));
res[s]++;
}
FE(i, res){
putString("", i->first[0]);
putString("", i->first[1]);
putString(" ");
FOR(j, 2, 10)putString("", i->first[j]);putString(" ");
REP(j, 4){FOR(k, 10+j*4, 10+(j+1)*4)putString("", i->first[k]);
putString(" ");
}
putInt(i->second, 10);
}
putLine();
}
OUTPUT;
return 0;
}