/*
    Author: Ritik Patel
*/

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& LIBRARIES &&&&&&&&&&&&&&&&&&&&&&&&&&&
 
#include <bits/stdc++.h>
using namespace std;
 
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DEFINES &&&&&&&&&&&&&&&&&&&&&&&&&&&

#define int long long int
// #define ll long long int
#define all(i) i.begin(), i.end()
#define sz(a) (int)a.size()
 
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CODE &&&&&&&&&&&&&&&&&&&&&&&&&&&

const int MAXN = 55;
vector<int> rows[MAXN], col[MAXN];
int g[MAXN][MAXN];
int N, K;

void checkr(int r1, int r2) {
    bool poss = true;
    for(int c = 1; c <= N; ++c) {
        poss &= g[r1][c] + g[r2][c] <= K;
    }
    if(poss) {
        rows[r1].push_back(r2);
        rows[r2].push_back(r1);
    }
}

void checkc(int c1, int c2) {
    bool poss = true;
    for(int r = 1; r <= N; ++r) {
        poss &= g[r][c1] + g[r][c2] <= K;
    }
    if(poss) {
        col[c1].push_back(c2);
        col[c2].push_back(c1);
    }
}


bool rvis[MAXN], cvis[MAXN];
int len = 0;

void dfs(int v) {
    rvis[v] = 1;
    ++len;
    for(auto &to: rows[v]) {
        if(!rvis[to])
            dfs(to);
    }
}

void dfs0(int v) {
    cvis[v] = 1;
    ++len;
    for(auto &to: col[v]) {
        if(!cvis[to])
            dfs0(to);
    }
}

const int MOD = 998244353;

void solve() {
    cin >> N >> K;
    for(int r = 1; r <= N; ++r)
        for(int c = 1; c <= N; ++c)
            cin >> g[r][c];
    
    for(int r = 1; r <= N; ++r)
        for(int rr = r + 1; rr <= N; ++rr)
            checkr(r, rr);
    
    for(int r = 1; r <= N; ++r)
        for(int rr = r + 1; rr <= N; ++rr)
            checkc(r, rr);
    
    int fact[MAXN];
    fact[0] = 1;
    for(int i = 1; i < MAXN; ++i) fact[i] = fact[i - 1] * i % MOD;
    
    int ans = 1;
    for(int r = 1; r <= N; ++r) {
        if(!rvis[r]) {
            len = 0;
            dfs(r);
            ans *= fact[len]; ans %= MOD;
        }
        if(!cvis[r]) {
            len = 0;
            dfs0(r);
            ans *= fact[len]; ans %= MOD;
        }
    }

    cout << ans << '\n';
    
}

int32_t main(){
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout); 
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int T = 1; 
    // cin >> T;
    for(int i = 1; i <= T; ++i){
        // cout << "Case #" << i << ": ";
        solve();
    }
    return 0;
}
 
/*
Sample inp
*/
#include<bits/stdc++.h>
#define N 60
#define A(i,m,n) for(int i=m;i<=n;++i)
using namespace std;
typedef long long LL;
const LL mod=998244353;
int a[N][N],n,k;
inline bool check1(int x,int y){
	A(i,1,n)if(a[x][i]+a[y][i]>k)return 0;
	return 1;
}
inline bool check2(int x,int y){
	A(i,1,n)if(a[i][x]+a[i][y]>k)return 0;
	return 1;
}
LL fc[N];
int fa[N],siz[N];
int findfa(int x){
	if(fa[x]!=x)fa[x]=findfa(fa[x]);
	return fa[x];
}
inline void mer(int x,int y){
	int tx=findfa(x),ty=findfa(y);
	if(tx!=ty){
		fa[tx]=ty;
		siz[ty]+=siz[tx];
	}
}
int main(){
	cin>>n>>k;
	fc[1]=1;
	A(i,2,n)fc[i]=(fc[i-1]*i)%mod;
	A(i,1,n){
		A(j,1,n)cin>>a[i][j];
		fa[i]=i;
		siz[i]=1;
	}
	A(i,1,n)
		A(j,i+1,n)
			if(findfa(i)!=findfa(j)&&check1(i,j)==1)mer(i,j);
	LL ans=1;
	A(i,1,n)
		if(findfa(i)==i)ans=ans*fc[siz[i]]%mod;
	A(i,1,n)fa[i]=i,siz[i]=1;
	A(i,1,n)
		A(j,i+1,n)
			if(findfa(i)!=findfa(j)&&check2(i,j)==1)mer(i,j);
	A(i,1,n)
		if(findfa(i)==i)ans=ans*fc[siz[i]]%mod;
	printf("%lld\n",ans);
	return  0;
}