#526. 最短路2

最短路2

题目描述

AA 是社团里的工具人,有一天他的朋友给了他一个n n 个点,mm 条边的正权连通无向图,要他计算所有点两两之间的最短路。

作为一个工具人,小 AA 熟练掌握着 floydfloyd 算法,设 w[i][j]w[i][j] 为原图中 (i,j)(i,j) 之间的权值最小的边的权值,若没有边则 w[i][j]=w[i][j]=无穷大。特别地,若 i=ji=j,则 w[i][j]=0w[i][j]=0

FloydFloyd 的 C++ 实现如下:

for(int k=1;k<=p;k++)   
for(int i=1;i<=n;i++)   
for(int j=1;j<=n;j++)   
  w[i][j]=min(w[i][j],w[i][k]+w[k][j]);   

p=np=n 时,该代码就是我们所熟知的 floydfloyd,然而小 AA 为了让代码跑的更快点,所以想减少 pp 的值。

Di,jDi,j 为最小的非负整数 xx,满足当 p=xp=x 时,点 ii 与点 jj 之间的最短路被正确计算了。

现在你需要求 ni=1nj=1Di∑ni=1∑nj=1Di,jj,虽然答案不会很大,但为了显得本题像个计数题,你还是需要将答案对 998244353998244353 取模后输出。

输入格式

第一行一个正整数 TT 表示数据组数

对于每组数据:

第一行两个正整数 n,mn,m,表示点数和边数。

接下来 mm 行,每行三个正整数 uu,vv,ww 描述一条边权为 ww 的边 (u,v)(u,v)

输出格式

输出 TT 行,第 ii 行一个非负整数表示第 ii 组数据的答案

样例

样例输入

1
4 4
1 2 1
2 3 1
3 4 1
4 1 1   

样例输出

6

数据范围与提示

对于 30% 30\% 的数据,$ 1 \leq T \leq 30,1 \leq n \leq 300, 1 \leq m \leq 2000, 1 \leq u \leq 10 ^ 9$ 。
对于 50% 50\% 的数据,$ 1 \leq T \leq 30,1 \leq n \leq 500, 1 \leq m \leq 2000, 1 \leq u \leq 10 ^ 9$ 。
对于 100% 100\% 的数据,$ 1 \leq T \leq 30,1 \leq n \leq 1000, 1 \leq m \leq 2000, 1 \leq u \leq 10 ^ 9$ 。