'''
拓扑图上的差分约束问题
对于一个序列 a1, a2, a3 .... ak而言
起点和终点分别是a1, ak 在大于等于a1小于等于ak这个区间里面
没有出现在原始序列里面的车,一定数值是严格小于a1, a2, .... ak的
假设这些点是b1, b2 ... bn
则a, b之间连一条边表示b 数值严格大于等于a+1
则总共边数会是n * k
每一组a 和 b如果都构造一个虚拟节点,让虚拟节点做中介
a到虚拟点连边权是0的边,虚拟节点到b全部连边权是1的边
这样边数量就可以缩小到n+k
然后再进行拓扑排序,在拓扑图上做差分约束求最长路
'''
from typing import List
from collections import deque
class TopoSort:
# edges是边列表, (a, b)代表一条边,表示a依赖于b, 返回拓扑排序之后的节点列表, 无法完成拓扑排序返回None
# 节点编号是1, 2, 3, .... node_num
@staticmethod
def sort(edges: List, node_num):
dep_cnt = [0] * (node_num + 1) # 每一个节点的依赖计数
link = {}
for a, b, w in edges:
if b not in link:
link[b] = []
link[b].append((a, w)) # link[b]记录哪些点依赖b
dep_cnt[a] += 1
ans = []
vals = [1] * (node_num+1) # 每个车站的数值
valid_node = deque() # 当前入度为0的所有节点
for idx, degree in enumerate(dep_cnt[1:]):
if degree == 0:
valid_node.append((idx+1, 1))
while len(ans) < node_num:
if len(valid_node) == 0:
return None
cur_node, val = valid_node.popleft()
if cur_node in link:
for next, w in link[cur_node]:
dep_cnt[next] -= 1
vals[next] = max(vals[next], val+w)
if dep_cnt[next] == 0:
valid_node.append((next, vals[next]))
ans.append(cur_node)
return max(vals[1:])
import sys
n, m = map(int, input().split())
edges = []
virtual_node = n+1
for _ in range(m):
s = sys.stdin.readline()
arr = list( map(int, s.split()) )
start, end = arr[1], arr[-1]
node_cnt = arr[0]
if node_cnt == end - start + 1:
continue
flag = [0] * (n+1)
for val in arr[1:]:
flag[val] = 1
for node in range(start, end+1):
if flag[node] == 0:
edges.append((virtual_node, node, 0))
else:
edges.append((node, virtual_node, 1))
virtual_node += 1
ans = TopoSort.sort(edges, virtual_node-1)
print(ans)