#include <iostream>
#include <queue>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
const int MAX_V=1000005;
//二维数组 用于存储树
//对应树的编号的 子节点
vector<int> tree[MAX_V];
int cmp(int a,int b){
return a>b;
}
int k;
int get_result(int root){
// 如果当前节点没有孩子,即使叶子节点,那么它就不需要分发,直接返回0
if (tree[root].empty()){
return 0;
}
//用于存储每个孩子节点分发完的时间
vector<int>tres;
for (int v : tree[root]) {
tres.push_back(get_result(v));
}
// 计算root节点的分发时间
// root分发的时候,先发给,那些分发完所需时间最长的子节点
sort(tres.begin(),tres.end(),cmp);
int ares=0;
for (int i = 0; i <tres.size() ; ++i) {
tres[i]=tres[i]+i/k+1;
ares=max(ares,tres[i]);
}
return ares;
}
int main(){
int row_num,num,parent,child;
//输入
cin>>k>>row_num;
for (int i = 0; i <row_num ; ++i) {
cin>>num>>parent;
for (int j = 0; j <num-1 ; ++j) {
cin>>child;
tree[parent].push_back(child);
}
}
//计算根结点的最短分发时间
cout<<get_result(0);
return 0;
}