Description:


如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus)。所谓简单回路就是指在图上不重复经过任何一个顶点的回路。
举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路:(4,3,2,1,6,5,4)、(7,8,9,10,2,3,7)以及(4,3,7,8,9,10,2,1,6,5,4),而(2,3)同时出现在前两个的简单回路里。另外,第三张图也不是仙人图,因为它并不是连通图。显然,仙人图上的每条边,或者是这张仙人图的桥(bridge),或者在且仅在一个简单回路里,两者必居其一。定义在图上两点之间的距离为这两点之间最短路径的距离。定义一个图的直径为这张图相距最远的两个点的距离。现在我们假定仙人图的每条边的权值都是1,你的任务是求出给定的仙人图的直径。

Input:


输入的第一行包括两个整数n和m( \(1\le n\le 50000\) 以及 \(0\le m\le 10000\) )。其中n代表顶点个数,我们约定图中的顶点将从1到n编号。接下来一共有m行。代表m条路径。每行的开始有一个整数k( \(2\le k\le 1000\) ),代表在这条路径上的顶点个数。接下来是k个1到n之间的整数,分别对应了一个顶点,相邻的顶点表示存在一条连接这两个顶点的边。一条路径上可能通过一个顶点好几次,比如对于第一个样例,第一条路径从3经过8,又从8返回到了3,但是我们保证所有的边都会出现在某条路径上,而且不会重复出现在两条路径上,或者在一条路径上出现两次。

Output:


只需输出一个数,这个数表示仙人图的直径长度。

Sample Input:


Sample Output:


题解:


仙人掌DP好难啊。

如果是一棵树,求直径可以如下更新:(v是u的子节点)

所以仙人掌的树边还是可以这样做。

如果是在环上,我们可以把这个环拆开(再复制一遍)DP。
\(p_i\) 为环上第 \(i\) 个点,环顶端为节点 \(p_{cnt}\)

答案更新的式子可以用单调队列优化。
画一画图就发现就是这样的。

单调队列没开大RE了好久Σ(っ °Д °;)っ