AT_agc056_f [AGC056F] Degree Sequence in DFS Order

Description

[problemUrl]: https://atcoder.jp/contests/agc056/tasks/agc056_f 整数 $ N $ と $ M $ が与えられます. 以下の手順で生成されうる整数列 $ a=(a_1,a_2,\cdots,a_N) $ の個数を $ 998244353 $ で割った余りを求めてください. - $ N $ 頂点,$ M $ 辺からなる連結な無向グラフ $ G $ を用意する. ここで,$ G $ は自己ループを含んではならないが,**多重辺を含んでもよい**. - $ G $ 上で DFS を行い,$ i $ ($ 1\ \leq\ i\ \leq\ N $) 番目に訪れた頂点の次数を $ a_i $ とする. より正確には,以下の疑似コードを実行して $ a $ を得る. ``` a = empty array dfs(v): visited[v]=True a.append(degree[v]) for u in g[v]: if not visited[u]: dfs(u) dfs(arbitrary root) ``` ここで,変数 $ g $ はグラフ $ G $ を隣接リストとして表したものであり,$ g[v] $ は頂点 $ v $ に隣接する頂点を**任意の順番**で格納したリストである. 例えば,$ N=4,M=5 $ の時,$ a=(2,4,1,3) $ を生成することは可能です. そのためには,以下のようなグラフ $ G $ を用意すればよいです. ![picture](https://cdn.luogu.com.cn/upload/vjudge_pic/AT_agc056_f/f99de1b2bc3fc84a7273d0da5117b15b6ccf98cf.png) ここで,頂点にかかれている数は,その頂点を DFS で何番目に訪れたかを表しています.($ 1 $ と書かれた頂点から DFS を開始しています.) また,オレンジ色の矢印は DFS での遷移を示しており,その横の数字は辺をたどる順番を表しています.

Input Format

入力は以下の形式で標準入力から与えられる. > $ N $ $ M $

Output Format

答えを出力せよ.

Explanation/Hint

### 制約 - $ 2\ \leq\ N\ \leq\ M\ \leq\ 10^6 $ - 入力される値はすべて整数である ### Sample Explanation 1 あり得るのは $ a=(2,2) $ のみです. $ G $ は多重辺を持ってもよいことに注意してください.