#include <bits/stdc++.h>
 
using namespace std;
 
//#define PRAGMA 448
#ifdef PRAGMA
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#endif
 
#ifdef LUCARIO
#define deb(...) fprintf(stderr,__VA_ARGS__)
#define deb1(x) cerr << #x << " = " << x << endl
#else
#define deb(...) 0
#define deb1(x) 0
#endif
 
typedef pair<long long,long long> pll;
typedef pair<int,int> pii;

#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define ld long double
#define int long long
#define pb push_back
#define bs binary_search
#define up upper_bound
#define f first 
#define s second 
#define ff first.first
#define fs first.second
#define sf second.first
#define ss second.second
#define mp make_pair    
#define endl "\n"
 
#define fore(i,a,b) for(ll i = a; i < b; i++)
#define rfore(i, a, b) for(ll i = b - 1; i >= a; i--)
#define forev(a,b) fore(i,0,b)cout<<a[i]<<" "; 
#define ing(g,u,v)  g[u].pb(v); g[v].pb(u);
#define ingp(g,u,v,c) (g[u].pb({v,c});g[v].pb({u,c});)
#define mm(a,b) memset(a , b , sizeof a) 
#define trans(a,b) trasform(a.begin(),a.end(),a.begin(),b)
#define np(a) next_permutation(a.begin(), a.end())
#define ALL(a) a.begin(),a.end() 
#define SZ(n) ((ll) (n).size())
#define sfind(s,t) (s.find(t) != string::npos)
 
#define infll (ll)1e14
#define infi  (int)(1e9+1)
#define PI 3.14159265359 
#define mod (ll)(1e9+7)
#define eps  1e-10

ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b,a%b); } 
ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); }


int32_t main(int32_t argc, char const *argv[]){
    FIN;

    int n,k; cin>>n>>k;
    int a[n][n];
    fore(i,0,n)fore(j,0,n)cin>>a[i][j];

    int res[n][n];
    mm(res,0);
    fore(i,0,n)res[i][i] = 1;
    int aux[n][n];

    while(k){
        if(k&1){
            fore(i,0,n){
                fore(j,0,n){
                    aux[i][j] = 0;
                    fore(l,0,n){
                        aux[i][j] = (aux[i][j] + res[i][l] * a[l][j])%mod;
                    }
                }
            }
            fore(i,0,n){
                fore(j,0,n){
                    res[i][j]=aux[i][j];
                }
            }
        }

        fore(i,0,n){
           fore(j,0,n){
                aux[i][j] = 0;
                fore(l,0,n){
                    aux[i][j] = (aux[i][j] + a[i][l] * a[l][j])%mod;
                }
            }
        }
        fore(i,0,n){
            fore(j,0,n){
                a[i][j]=aux[i][j];
            }
        }
        k /= 2;

    }
    int resu = 0;
    fore(i,0,n){
        fore(j,0,n){
            resu = (resu +res[i][j])%mod;
        }

    }

    cout<<resu;


    return 0;
}
























/*
Para las DP:

Los arreglos donde estén los valores en lo posible se declaran como INT
siempre hacer int &r = dp...
int res y trabajas todo con res
luego haces return r = res
cuando se trabaja se hace solve(...)+a[x];


Fórmulas:

priority_queue < int,vector<int>,greater<int> > q; calse contenedor y comparacion

cero = r/k  -(l/k + (l%k!=0)) +1; cantidad de números divisibles por k en el intervalo [l, r]
upper_bound primer elemento mayor estricto
lower_bound primer elemento mayor o igual
Al hacer BFS con distancia recordar simpre antes de visitar preguntar si ya llegue antes con
un peso menor 
setprecision(15)
freopen("nombre.archivo",stdin);
freopen("nombre.archivo",stdout);

*/












Measured memory_bytes: 384