#include <stdio.h>
#include <stdlib.h>
#define MOD_BY 998244353
#define INV_6 166374059
int add(int a, int b) {
return a + b - MOD_BY * (a + b >= MOD_BY);
}
int sub(int a, int b) {
return b == 0 ? a : add(a, MOD_BY - b);
}
int mul(int a, int b) {
return (int)((long long)a * b % MOD_BY);
}
int pou(int a, int b) {
int r = 1;
while (b > 0) {
if (b & 1) r = mul(r, a);
a = mul(a, a);
b >>= 1;
}
return r;
}
int N;
int A[114514][6];
struct meow {
int value;
int idx;
};
int cmp(const void* x, const void* y) {
struct meow a = *(const struct meow*)x, b = *(const struct meow*)y;
return a.value < b.value ? -1 : a.value > b.value;
}
struct meow nyan[114514 * 6];
int dice_used[114514];
int used_counts[7];
int main(void) {
int i, j;
int ans = 0;
int prev_prob = 0;
if (scanf("%d", &N) != 1) return 1;
for (i = 0; i < N; i++) {
for (j = 0; j < 6; j++) {
if (scanf("%d", &A[i][j]) != 1) return 1;
nyan[i * 6 + j] = (struct meow){ A[i][j], i };
}
}
qsort(nyan, N * 6, sizeof(*nyan), cmp);
used_counts[0] = N;
for (i = 0; i < N * 6; i++) {
used_counts[dice_used[nyan[i].idx]]--;
dice_used[nyan[i].idx]++;
used_counts[dice_used[nyan[i].idx]]++;
if (nyan[i].value != nyan[i + 1].value) {
int prob = 1;
for (j = 0; j <= 6; j++) {
prob = mul(prob, pou(j, used_counts[j]));
}
ans = add(ans, mul(sub(prob, prev_prob), nyan[i].value % MOD_BY));
prev_prob = prob;
}
}
printf("%d\n", mul(ans, pou(INV_6, N)));
return 0;
}
/*
下からやる
「最大値がそれ以下の確率」から「最大値がそれ未満の確率」を引く
→「最大値がそれの確率」になる
*/