import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int times = scanner.nextInt();
for(int i=0;i<times;i++){
//特征的行数
/*
循环输入,按List<List<Integer>>保存数据
*/
int n = scanner.nextInt();
List<List<Integer>> list = new ArrayList<>(n);
for(int j=0;j<n;j++){
int size = scanner.nextInt();
List<Integer> sp = new ArrayList<>();
for(int m = 0;m <size*2;m++){
sp.add(scanner.nextInt());
}
list.add(sp);
}
//将封装好List<List<Integer>>的数据进行处理
/*
数据输入的格式
1
8
2 1 1 2 2
2 1 1 1 4
数据封装在List<List<Integer>>的格式
1 1 2 2
1 1 1 4
*/
display(list);
}
}
public static void display(List<List<Integer>> list){
Map<String,Integer> map = new HashMap<>();
map.put("max",0);
//put 一个最大值
for(int i=0;i<list.size();i++){
//每一次遍历数组的2个值
for(int j=0;j<list.get(i).size();j+=2){
// 将key 以字符串的格式拼接
String str = list.get(i).get(j)+"and"+list.get(i).get(j+1);
int num = 0;
/*
所有用例的输入特征总数和<100000
-->map value 的最大值不超过100000
所以以 最后出现的特征的行数 * 100000 + 已经连续的次数进行保存
*/
if(map.get(str)!=null && map.get(str)/100000==i-1){//表示这个特征是连续的
// map.get(str)/100000==i-1 如果最后出现特征的行数是上一行 表示连续
num = map.get(str)%100000 + 1;
map.put(str,100000*i+num);
//将连续的次数加一 并换上新的行数
}else{
//这个特征不是连续的,则默认初始化为一
map.put(str,100000*i+1);
num =1;//不管连续还是不连续都要与max 比较大小
}
if(map.get("max") < num){
map.put("max",num);
}
}
}
System.out.println(map.get("max"));
}
}