盒先生的星星
题号:NC318507
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

历史上,盒先生曾经在一场比赛中连着出了三道数数题。由于众多选手参与了那场比赛且这三道数数题都是简单题的定位,这场比赛被选手们狠狠羞辱了。
现在,为了纪念那个时刻,盒先生又出了一个数数题给你做。
定义一张无向图 S 为星图,当且仅当图 S 是树(即无重边无环的无向连通图),且图 S 包含边数最多的简单路径恰好包含 2 条边。注意,仅包含两个点一条边的无向图不是星图。
定义星图 S 的根 r(S) 为星图 S 中唯一一个度数大于 1 的点。
现在,给定一张 n 个点 m 条边无重边无自环的无向图 G,你需要找到一组 G 的星子图,使得 G 中的每个点作为其中最多一张星子图的根,且 G 中的每条边恰好出现在其中一张星子图中,并计算这样的星子图组的方案数。形式化的,你需要计算集合 \{S_1,S_2,\cdots,S_k\} 的方案数,使得:
1. 对于任意 i\in\{1,2,\cdots,k\}S_iG 的子图。
2. 对于任意 i\in\{1,2,\cdots,k\}S_i 是星图。
3. 不存在 i,j\in\{1,2,\cdots,k\}i\neq j,使得 r(S_i)=r(S_j)
4. 对于任意 G 中的边 e,存在 i\in\{1,2,\cdots,k\},满足 e\in S_i 并且对于任意 j\in\{1,2,\cdots,k\},j\neq ie\notin S_j
特别的,若 k=0,即某方案不包含任何星子图也合法,也算一种方案。
由于答案可能会很大,你只需要输出答案对 10^9+7 取模后的结果。
注意,两个星子图 S_iS_j 不同,可以是点集不同,也可以是边集不同,我们以有标号无向图的视角看待它们。

输入描述:

第一行两个整数 n,m (1\leq n\leq 20,0\leq m\leq n(n-1)/2),表示无向图的点数和边数。
接下来 m 行,每行两个整数 x,y (1\leq x,y\leq n,x\neq y),表示无向图中有一条连接点 x 和点 y 的边,保证无重边。

输出描述:

输出一行一个整数表示答案对 10^9+7 取模后的结果。
示例1

输入

复制
4 4
1 2
2 3
3 4
4 1

输出

复制
2