//By Tushar Gautam
#pragma GCC optimize ("-O2")
#include <bits/stdc++.h>
using namespace std;
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define memreset(a) memset(a,0,sizeof(a))
#define testcase(t) int t;cin>>t;while(t--)
#define forstl(i,v) for(auto &i: v)
#define forn(i,e) for(int i = 0; i < e; i++)
#define forsn(i,s,e) for(int i = s; i < e; i++)
#define rforn(i,s) for(int i = s; i >= 0; i--)
#define rforsn(i,s,e) for(int i = s; i >= e; i--)
#define leadzero(a) __builtin_clz(a) // count leading zeroes
#define trailzero(a) __builtin_ctz(a) // count trailing zeroes
#define bitcount(a) __builtin_popcount(a) // count set bits (add ll)
#define ln "\n"
#define dbgarr(v,s,e) cerr<<#v<<" = "; forsn(i,s,e) cerr<<v[i]<<", "; cerr<<endl
#define inputfile freopen("input.txt", "r", stdin)
#define outputfile freopen("output.txt", "w", stdout)
#define dbg(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); \
stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) { cerr<<endl; }
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
	cerr << *it << " = " << a << "\t"; err(++it, args...);
}
template<typename T1,typename T2>
ostream& operator <<(ostream& c,pair<T1,T2> &v){
	c<<"("<<v.fi<<","<<v.se<<")"; return c;
}
template <template <class...> class TT, class ...T>
ostream& operator<<(ostream& out,TT<T...>& c){
    out<<"{ ";
    forstl(x,c) out<<x<<" ";
    out<<"}"; return out;
}
typedef long long int  ll;
typedef long double  ld;
typedef pair<ll,ll> p64;
typedef pair<int,int> p32;
typedef pair<int,p32> p96;
typedef vector<ll> v64;
typedef vector<int> v32; 
typedef vector<v32> vv32;
typedef vector<v64> vv64;
typedef vector<p32> vp32;
typedef vector<vp32> vvp32;
typedef map<int,int> m32;
const int LIM = 1e5+5, MOD = 1e9+7;
int t,n,m,k,x,y;
const int SZ=50;
ll add(ll a, ll b){
	return (a + b)%MOD;
}
ll mult(ll a, ll b){
	return a*b%MOD;;
}
struct matrix{
	ll arr[SZ][SZ];
	void reset(){
		memset(arr, 0, sizeof(arr));
	}
	void makeiden(){
		reset();
		for(int i=0;i<SZ;i++){
			arr[i][i] = 1;
		}
	}
	matrix operator + (const matrix &o) const {
		matrix res;
		for(int i=0;i<SZ;i++){
			for(int j=0;j<SZ;j++){
				res.arr[i][j] = add(arr[i][j], o.arr[i][j]);
			}
		}
		return res;
	}
	matrix operator * (const matrix &o) const {
		matrix res;
		for(int i=0;i<SZ;i++){
			for(int j=0;j<SZ;j++){
				res.arr[i][j] = 0;
				for(int k=0;k<SZ;k++){
					res.arr[i][j] = add(res.arr[i][j] , mult(arr[i][k] , o.arr[k][j]));
				}
			}
		}
		return res;
	}
};
matrix mpower(matrix a, ll b){
	matrix res;
	res.makeiden();
	while(b){
		if(b & 1){
			res = res * a;
		}
		a = a * a;
		b >>= 1;
	}
	return res;
}
matrix transpose(matrix a){
	matrix res;
	for(int i=0;i<SZ;i++){
		for(int j=0;j<SZ;j++){
			res.arr[i][j] = a.arr[j][i];
		}
	}	
	return res;
}
void display(matrix a){
	forn(i,SZ){
		forn(j,SZ){
			cout<<a.arr[i][j]<<" ";
		}
		cout<<ln;
	}
}
int main(){
	fastio;
	ll k;
	cin>>n>>k;
	matrix m;
	m.reset();
	forn(i,n) forn(j,n) cin>>m.arr[i][j];
	auto r=mpower(m,k);
	ll ans=0;
	forn(i,n) forn(j,n) ans=(ans+r.arr[i][j])%MOD;
	cout<<ans<<ln;
	return 0;
}

Measured memory_bytes: 384