#include <bits/stdc++.h>
#ifdef ONLINE_JUDGE
#define endl "\n"
#endif
using namespace std;
typedef unsigned long long int lu;
typedef long long int ll;
typedef long double ld;
typedef vector<ll> v;
typedef vector<lu> vu;
typedef vector<v> vv;
typedef vector<vu> vvu;
typedef vector<ld> vld;
typedef vector<bool> vb;
typedef vector<string> vs;
typedef pair<ll, ll> pll;
typedef vector<set<ll>> vsll;
typedef set<pair<ll, ll>> spll;
typedef vector<spll> vspll;
typedef vector<pll> vpll;
typedef pair<lu, lu> puu;
typedef vector<puu> vpuu;
const ll MOD = 1000000007;
const ld PI = 2 * acos(0.0);
const v dx = {1, -1, 0, 0};
const v dy = {0, 0, 1, -1};
#define round(x, y) ((x + y - 1) / y)
#define ce(x, y) ((x + y - 1) / y)
#define amax(x, y) \
    if (y > x)     \
        x = y;
#define amin(x, y) \
    if (y < x)     \
        x = y;
#define lcm(x, y) ((x) * (y) / __gcd(x, y))
#define sz(x) (ll) x.size()
#define sq(x) ((x) * (x))
#define cb(x) ((x) * (x) * (x))
#define yes cout << "YES\n";
#define no cout << "NO\n";
#define yesno(f) \
    if (f)       \
        yes else no;
#define noo \
    { no return; }

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

template <typename T = ll>
vector<T> ga(ll n, bool oneIndexed = false) {
    vector<T> a = vector<T>(n + oneIndexed);

    for (ll i = 0; i < n; i++) {
        T p;
        cin >> p;
        a[i + oneIndexed] = p;
    }

    return move(a);
}

template <typename T, typename A>
void pa(vector<T, A> const &a, ll begin = 0, ll end = -1) {
    if (end == -1)
        end = sz(a) - 1;
    for (ll i = begin; i <= end; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

const ll N = 1e5 + 5;
const ll SZ = 55;

ll pow(ll a, ll b, ll m) {
    ll ans = 1;
    while (b) {
        if (b & 1)
            ans = (ans * a) % m;
        b /= 2;
        a = (a * a) % m;
    }
    return ans;
}

ll add(ll a, ll b) {
    ll res = a + b;
    return res % MOD;
}

template <typename T>
T multmod(T a, T b, T mod) {
    if (a == 0 || b == 0)
        return 0;
    if (b == 1)
        return a % mod;
    ll p = a * b;
    // if does not overflow, return immediately
    if (p / a == b)
        return p % mod;
    if (b & 1)
        return (a + 2 * multmod(a, b / 2, mod)) % mod;
    else
        return (2 * multmod(a, b / 2, mod)) % mod;
}

ll mult(ll a, ll b) {
    return multmod(a, b, (ll)1e9 + 7);
}

struct matrix {
    ll arr[SZ][SZ];

    void reset() {
        memset(arr, 0, sizeof(arr));
    }

    void makeiden() {
        reset();
        for (ll i = 0; i < SZ; i++) {
            arr[i][i] = 1;
        }
    }

    matrix operator+(const matrix &o) const {
        matrix res;
        for (ll i = 0; i < SZ; i++) {
            for (ll 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 (ll i = 0; i < SZ; i++) {
            for (ll j = 0; j < SZ; j++) {
                res.arr[i][j] = 0;
                for (ll 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 power(matrix a, ll b) {
    matrix res;
    res.makeiden();

    while (b) {
        if (b & 1) {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}

void solve() {
    matrix arr;
    ll n, k;
    cin >> n >> k;
    for (ll i = 0; i < n; i++) {
        for (ll j = 0; j < n; j++) {
            cin >> arr.arr[i][j];
        }
    }

    matrix res = power(arr, k);
    ll c = 0;
    for (ll i = 0; i < n; i++) {
        for (ll j = 0; j < n; j++) {
            c += res.arr[i][j];
            c %= MOD;
        }
    }

    cout << c;
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    solve();
    return 0;
}

Measured memory_bytes: 384