#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define foir(i,l,r) for (register int i=l;i<=r;++i)
#define fopr(i,l,r) for (register int i=l;i>=r;--i)
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define maxn 110
#define maxm 2010
#define mod 998244353
inline int read()
{
int x=0;bool f=0;char c=getchar();
while (!isdigit(c)) f|=c=='-',c=getchar();
while (isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
ll n,m;
ll ans,ans2;
ll s[maxn];
ll a[maxn][maxm];
ll f[maxn][maxn][maxn];
ll g[maxn][maxn];
inline void init()
{
n=read(),m=read();
foir(i,1,n)
foir(j,1,m)
{
a[i][j]=read();
s[i]+=a[i][j];
s[i]%=mod;
}
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
init();
foir(h,1,m)
{
// f[i][j][k]:当前选到第i行,在其他列选了k个,第h行选了j个,的方案数
// cout<<h<<endl;
memset(f,0,sizeof(f));
f[0][0][0]=1;
foir(i,1,n)
foir(j,0,n)
foir(k,0,n)
f[i][j][k]=(f[i-1][j][k]%mod+((k-1>=0?f[i-1][j][k-1]:0)%mod*(s[i]-a[i][h]+mod)%mod)%mod+((j-1>=0?f[i-1][j-1][k]:0)%mod*a[i][h]%mod)%mod)%mod/*,cout<<i<<" "<<j<<" "<<k<<":"<<f[i][j][k]<<endl*/;
foir(j,0,n)
foir(k,0,n)
if (j>k)
ans+=f[n][j][k],ans%=mod;
}
g[0][0]=1;
foir(i,1,n)
{
foir(j,0,n)
{
if (j>0) g[i][j]=(g[i-1][j]%mod+s[i]%mod*g[i-1][j-1]%mod)%mod;
else g[i][j]=g[i-1][j];
}
}
foir(j,1,n)
ans2+=g[n][j],ans2%=mod;
cout<<(ans2-ans+mod)%mod<<endl;
return 0;
}