#include<iostream> #include<cstdio> #include<cstring> #define MOD (998244353) using namespace std; typedef long long ll;
ll qmi(ll a, ll b); int n, m; struct num { ll x, y; num operator + (const num a) const {return {(x + a.x) % MOD, (y + a.y) % MOD};} num operator - (const num a) const {return {(x - a.x + MOD) % MOD, (y - a.y + MOD) % MOD};} num operator * (const num a) const {return {(x * a.y + y * a.x) % MOD, y * a.y % MOD};} num operator / (const num a) const { ll inv = qmi(a.y, MOD - 2); return {((x * a.y - y * a.x) % MOD + MOD) * inv % MOD * inv % MOD, y * inv % MOD}; } } a[35][35]; struct edge { int u, v, w; } e[1005];
ll qmi(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; }
int gauss() { num res = num({0, 1}); int w = 1; for (int i = 1; i < n; i++) { for (int j = i + 1; j < n; j++) { if (a[j][i].y) { swap(a[j], a[i]), w = -w; break; } } num inv = num({0, 1}) / a[i][i]; for (int j = i + 1; j < n; j++) { num d = a[j][i] * inv; for (int k = i; k < n; k++) a[j][k] = a[j][k] - a[i][k] * d; } } for (int i = 1; i < n; i++) res = res * a[i][i]; return w > 0 ? res.x : (num({0, 0}) - res).x; }
int phi(int x) { int res = x; for (int i = 2; i <= x; i++) { if (x % i == 0) res -= res / i; while (x % i == 0) x /= i; } if (x > 1) res -= res / x; return res; }
int main() { int mx = 0, ans = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w); mx = max(mx, e[i].w); } for (int i = 1; i <= mx; i++) { memset(a, 0, sizeof(a)); int tot = 0; for (int j = 1; j <= m; j++) { if (e[j].w % i) continue; tot++; int u = e[j].u, v = e[j].v, w = e[j].w; num P = num({w, 1}); a[u][u] = a[u][u] + P, a[v][v] = a[v][v] + P; a[u][v] = a[u][v] - P, a[v][u] = a[v][u] - P; } if (tot < n - 1) continue; int t = gauss(); ans = (ans + (ll)phi(i)* t % MOD) % MOD; } printf("%d", ans); return 0; }