// #include<bits/stdc++.h>
// // #define int long long
// #pragma GCC optimize(3,"Ofast","inline")
// #define debug(...) fprintf(stderr,__VA_ARGS__)
// #define ll long long
// #define bint __int128
// #define ull unsigned long long
// #define uint unsigned int
// #define ld double
// #define PII pair<int,int>
// #define chkmax(a,b) a=max(a,b)
// #define chkmin(a,b) a=min(a,b)
// #define rep(k,l,r) for(int k=l;k<=r;++k)
// #define per(k,r,l) for(int k=r;k>=l;--k)
// #define cl(f,x) memset(f,x,sizeof(f))
// #define pcnt(x) __builtin_popcount(x)
// #define lg(x) (31-__builtin_clz(x))
// using namespace std;
// void file_IO() {
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
// }
// bool M1;
// const int INF=0x3f3f3f3f;
// const ll INFLL=0x3f3f3f3f3f3f3f3f;
// const ld eps=1e-9;
// template<int p>
// struct mint {
// int x;
// mint() {
// x=0;
// }
// mint(int _x) {
// if(_x<0)
// _x+=p;
// x=_x;
// }
// friend mint operator + (mint a,mint b) {
// return a.x+b.x>=p? a.x+b.x-p:a.x+b.x;
// }
// friend mint operator - (mint a,mint b) {
// return a.x<b.x? a.x-b.x+p:a.x-b.x;
// }
// friend mint operator * (mint a,mint b) {
// return 1ll*a.x*b.x%p;
// }
// friend mint operator ^ (mint a,ll b) {
// mint res=1,base=a;
// while(b) {
// if(b&1)
// res*=base;
// base*=base; b>>=1;
// }
// return res;
// }
// friend mint operator ~ (mint a) {
// return a^(p-2);
// }
// friend mint operator / (mint a,mint b) {
// return a*(~b);
// }
// friend mint & operator += (mint& a,mint b) {
// return a=a+b;
// }
// friend mint & operator -= (mint& a,mint b) {
// return a=a-b;
// }
// friend mint & operator *= (mint& a,mint b) {
// return a=a*b;
// }
// friend mint & operator /= (mint& a,mint b) {
// return a=a/b;
// }
// friend mint operator ++ (mint& a) {
// return a+=1;
// }
// friend mint operator -- (mint& a) {
// return a-=1;
// }
// };
// const int MOD=998244353;
// #define mint mint<MOD>
// const int N=4e2+5,M=8e2+5;
// mint f[2][4][M];
// bool used[N][M];
// void solve() {
// int n;
// scanf("%d",&n);
// rep(i,1,n) {
// int m;
// scanf("%d",&m);
// while(m--) {
// int x;
// scanf("%d",&x);
// used[i][x]=true;
// }
// }
// mint res=0;
// rep(v,-n,800-n) {
// int p=0;
// rep(k,0,3) {
// rep(j,0,800)
// f[p][k][j]=0;
// }
// f[p][0][0]=1;
// rep(i,1,n) {
// p^=1;
// rep(k,0,3) {
// rep(j,0,800)
// f[p][k][j]=0;
// }
// rep(k,0,3) {
// mint tot=0;
// rep(j,0,800) {
// tot+=f[p^1][k][j];
// if(j-i>=v&&used[i][j])
// f[p][k|((j-i==v)<<1)|(j-i>=v+n)][j]+=tot;
// }
// }
// }
// rep(i,0,800)
// res+=mint(-v-n+1)*f[p][3][i];
// }
// rep(v,-1,799) {
// int p=0;
// rep(k,0,3) {
// rep(j,0,800)
// f[p][k][j]=0;
// }
// f[p][0][0]=1;
// rep(i,1,n) {
// p^=1;
// rep(k,0,3) {
// rep(j,0,800)
// f[p][k][j]=0;
// }
// rep(k,0,3) {
// mint tot=0;
// rep(j,0,800) {
// tot+=f[p^1][k][j];
// if(j-i<=v&&used[i][j])
// f[p][k|((j-i==v)<<1)|(j-i<=v-n)][j]+=tot;
// }
// }
// }
// rep(i,0,800)
// res+=mint(v)*f[p][3][i];
// }
// printf("%d\n",res.x);
// }
// bool M2;
// // g++ QOJ8820.cpp -std=c++14 -Wall -O2 -o QOJ8820
// signed main() {
// // file_IO();
// int testcase=1;
// // scanf("%d",&testcase);
// while(testcase--)
// solve();
// debug("used time = %dms\n",(signed)(1000*clock()/CLOCKS_PER_SEC));
// debug("used memory = %dMB\n",(signed)((&M1-&M2)/1024/1024));
// return 0;
// }
// 怎么卡我常,贺个代码过了 /fn
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=403,K=800,H=998244353;
ll n,m,ans,f[N*2][2][2],g[N*2][2][2];
bool vis[N][N*2];
void Add(ll &x,ll y){x=x+y>=H?x+y-H:x+y;}
void NB(ll &x,ll y){x=(x+y)%H;}
ll Sol1(ll v)
{
memset(f,0,sizeof(f));f[0][0][0]=1;ll s=0;
for(int t=1;t<=n;t++)
{
memcpy(g,f,sizeof(g));memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)for(int x:{0,1})for(int y:{0,1})
Add(g[i][x][y],g[i-1][x][y]);
for(int z=0;z<=min(m,t+v);z++)if(vis[t][z])for(int x:{0,1})for(int y:{0,1})
Add(f[z][x|(z-t==v)][y|(z-t<=v-n)],g[z][x][y]);
}
for(int i=0;i<=m;i++)Add(s,f[i][1][1]);
return s;
}
ll Sol2(ll v)
{
memset(f,0,sizeof(f));f[0][0][0]=1;ll s=0;
for(int t=1;t<=n;t++)
{
memcpy(g,f,sizeof(g));memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)for(int x:{0,1})for(int y:{0,1})
Add(g[i][x][y],g[i-1][x][y]);
for(int z=max(v+t,0ll);z<=K;z++)if(vis[t][z])for(int x:{0,1})for(int y:{0,1})
Add(f[z][x|(z-t==v)][y|(z-t>=v+n)],g[z][x][y]);
}
for(int i=0;i<=m;i++)Add(s,f[i][1][1]);
return s;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
ll len,x;cin>>len;
while(len--)cin>>x,vis[i][x]=1,m=max(m,x);
}
for(ll v=-1;v<=m;v++)NB(ans,Sol1(v)*(v+H));
for(ll v=-n;v<=m-n;v++)NB(ans,Sol2(v)*(-v-n+1+H));
cout<<ans;
}