#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("regine2.in");
ofstream out("regine2.out");
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define pb push_back
#define mp make_pair
const int NMax = 15 + 5;
const int inf = 1e9 + 5;
using zint = short;
zint T,N,mx,nrMx;
bool obj[NMax][NMax],prin[NMax],sec[NMax],col[NMax],row[NMax];
void backT(zint,zint,zint);
template<class T>
void cpy(T*,T*,zint);
int main() {
in>>T;
while (T--) {
in>>N;
for (zint i=1;i <= N;++i) {
for (zint j=1;j <= N;++j) {
char c;
in>>c;
obj[i][j] = (c == '#');
}
}
for (zint i=1;i < NMax;++i) {
col[i] = prin[i] = sec[i] = false;
}
mx = -1, nrMx = 0;
backT(1,0,1);
out<<mx<<' '<<nrMx<<'\n';
}
in.close();out.close();
return 0;
}
void backT(zint i,zint nrDame,zint st) {
if (i == N+1) {
if (nrDame > mx) {
mx = nrDame;
nrMx = 1;
}
else if (nrDame == mx) {
++nrMx;
}
return;
}
if (st > N) {
return;
}
//backT(i+1,nrDame,1);
bool colCpy[NMax],prinCpy[NMax],secCpy[NMax],rowCpy[NMax];
if (st == 1) {
cpy(rowCpy,row,N);
cpy(colCpy,col,N);
cpy(prinCpy,prin,2*N);
cpy(secCpy,sec,2*N);
for (zint j=1;j <= N;++j) {
if (obj[i][j]) {
col[j] = prin[N + i - j] = sec[i+j] = false;
continue;
}
}
}
bool ok = false;
for (zint j=st;j <= N;++j) {
ok = true;
if (obj[i][j]) {
//row[i] = col[j] = prin[N + i - j] = sec[i+j] = false;
continue;
}
if (row[i] || col[j] || prin[N + i - j] || sec[i+j]) {
continue;
}
cout<<i<<' '<<j<<' '<<nrDame+1<<'\n';
row[i] = col[j] = prin[N + i - j] = sec[i+j] = true;
backT(i,nrDame+1,j+1);
//backT(i+1,nrDame+1,1);
row[i] = col[j] = prin[N + i - j] = sec[i+j] = false;
}
backT(i+1,nrDame,1);
if (st == 1) {
cpy(row,rowCpy,N);
cpy(col,colCpy,N);
cpy(prin,prinCpy,2*N);
cpy(sec,secCpy,2*N);
}
/*
if (ok) {
backT(i+1,nrDame,1);
}
//*/
}
template<class T>
void cpy(T *a,T* b,zint sz) {
for (zint i=1;i <= sz;++i) {
a[i] = b[i];
}
}