정휘는 알고리즘 강의에서 그래프의 최소 신장 트리를 구하는 알고리즘인 크루스칼 알고리즘에 대해 배웠다. 크루스칼 알고리즘은 다음과 같이 동작한다.
연결 무향 가중치 그래프가 주어졌을 때 알고리즘이 최소 신장 트리를 구한다는 것은 어렵지 않게 증명할 수 있다.
정휘는 (1)에서 가중치가 같은 간선을 정렬하는 기준이 없다는 점이 마음에 들지 않는다. 같은 그래프가 주어져도 다른 결과가 나올 수 있다는 것은 용납할 수 없는 일이다. 정휘는 자신의 분노를 수치화하기 위해 얼마나 다양한 결과가 나올 수 있을지 계산하려고 했지만, 알고리즘 강의가 끝날 때까지 그 방법을 찾지 못해서 여러분에게 문제로 내기로 했다.
N개의 정점과 M개의 간선으로 구성된 단순 연결 무향 가중치 그래프가 주어진다. 크루스칼 알고리즘을 이용해 최소 신장 트리를 구할 때, F에 간선을 추가하는 방법의 수를 구하는 프로그램을 작성해 보자. F에 추가된 간선들의 집합이 다르거나, 간선들을 추가하는 순서가 다르다면 다른 방법으로 센다.
첫째 줄에 정점의 개수 N과 간선의 개수 M이 공백으로 구분되어 주어진다.
둘째 줄부터 M개의 줄에 걸쳐 두 간선이 연결하는 정점 번호 u_i,v_i와 간선의 가중치 w_i가 주어진다.
F에 간선을 추가하는 순서로 가능한 경우의 수를 998,244,353(=119×223+1)으로 나눈 나머지를 출력한다.