import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        for(int i = 0; i < N; ++i){
            int r = 1;
            List<Set<List<Integer>>> v = new ArrayList<>();
            for(int j = 0; j < M; ++j){//输入部分开始
                int n = sc.nextInt();
                Set<List<Integer>> temp = new HashSet<>();
                for(int k = 0; k < n; ++k){
                    int a = sc.nextInt();
                    int b = sc.nextInt();
                    List<Integer> c = new ArrayList<>();
                    c.add(a);
                    c.add(b);
                    temp.add(c);
                }
                v.add(temp);
            }//输入部分结束
            for(int j = 0; j < M - 1; ++j){//连续特征长度从当前这行开始数
                Set<List<Integer>> temp = v.get(j);
                Map<List<Integer>, Integer> bwt = new HashMap<>();
                for(List<Integer> k : temp) bwt.put(k, 1);//每个特征都是从1开始数
                for(int k = j + 1; k < M; ++k){
                    for(List<Integer> p : temp){
                        if(!v.get(k).contains(p)) {
                            int y = bwt.get(p);
                            if(y > r) r = y;//连续特征中断时,更新全局最优解
                            bwt.put(p, 0);//用0作为连续特征发生中断的标志
                        }
                    }
                    for(List<Integer> p : v.get(k)){
                        if(temp.contains(p)){
                            int y = bwt.get(p);
                            if(y != 0) bwt.put(p, y + 1);//已中断的特征不再计数
                        }
                    }
                }
                int z = 1;
                for(Integer bwti : bwt.values()){//找到当前这行开始的最长特征链长度
                    if(bwti > z) z = bwti;
                }
                if(z > r) r = z;//更新全局最优解(那些一直到末尾都没中断的连续特征)
            }
            System.out.println(r);
        }
    }
}