import java.util.Scanner;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int t = 0; t < T; t++) {
int N = scanner.nextInt();
int[][] graph = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
graph[i][j] = scanner.nextInt();
}
}
int[] result = findComponentsIsolatedVillagesAndBridges(graph, N);
System.out.println(result[0] + " " + result[1] + " " + result[2]);
}
}
public static int[] findComponentsIsolatedVillagesAndBridges(int[][] graph, int n) {
int numComponents = 0;
int isolatedVillages = 0;
int bridges = 0;
boolean[] visited = new boolean[n];
for (int i = 0; i < n; i++) {
if (!visited[i]) {
numComponents++;
BFS(graph, i, visited, n);
}
}
for (int i = 0; i < n; i++) {
visited[i] = false;
}
for (int i = 0; i < n; i++) {
visited[i] = true;
for (int j = i + 1; j < n; j++) {
if (graph[i][j] == 1) {
graph[i][j] = graph[j][i] = 0;
for (int k = 0; k < n; k++) {
visited[k] = false;
}
BFS(graph, i, visited, n);
if (!areAllVisited(visited)) {
isolatedVillages++;
bridges++;
}
graph[i][j] = graph[j][i] = 1;
}
}
}
int[] result = {numComponents, isolatedVillages, bridges};
return result;
}
public static void BFS(int[][] graph, int start, boolean[] visited, int n) {
Queue<Integer> queue = new LinkedList<>();
queue.add(start);
visited[start] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
for (int i = 0; i < n; i++) {
if (graph[node][i] == 1 && !visited[i]) {
visited[i] = true;
queue.add(i);
}
}
}
}
public static boolean areAllVisited(boolean[] visited) {
for (boolean b : visited) {
if (!b) {
return false;
}
}
return true;
}
}