#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
#define SIZE 22 // 22
#define SIZE2 101 // 101
int map[SIZE][SIZE];
int dx[] = { 1,1,-1,-1 };
int dy[] = { 1,-1,-1,1 };
int numArr[SIZE2];
int ans;
int maxVal;
int N;
void problemIn() {
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
}
void init() {
ans = 0;
maxVal = 0;
memset(numArr, 0, sizeof(numArr));
}
void dfs(int depth, int x, int y, int endX, int endY) {
if (depth == 4) {
if (x == endX && y == endY) {
ans = 0;
for (int i = 0; i < 101; i++) {
if (numArr[i] == 1) {
ans++;
}
}
maxVal = max(maxVal, ans);
return;
}
}
int nx = x + dx[depth];
int ny = y + dy[depth];
if (nx < 0 || ny < 0 || nx >= N || ny >= N) return;
else {
if (numArr[map[nx][ny]] == 0) {
numArr[map[nx][ny]] = 1;
dfs(depth, nx, ny, endX, endY); // 방향 유지
dfs(depth + 1, nx, ny, endX, endY); // 방향 변경
numArr[map[nx][ny]] = 0;
}
else {
dfs(depth + 1, x, y, endX, endY); // 갈 길이 없어서 방향 변경
}
}
}
void solve() {
for (int i = 0; i < N - 1; i++) {
for (int j = 1; j < N - 1; j++) {
numArr[map[i][j]] = 1;
dfs(0, i, j, i+1, j-1);
numArr[map[i][j]] = 0;
}
}
}
int main() {
int T;
cin >> T;
for (int tc = 1; tc <= T; tc++) {
problemIn();
solve();
if (maxVal == 0) {
maxVal = -1;
}
cout << "#" << tc << " " << maxVal << endl;
init();
}
return 0;
}