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

template<class Numeric> class Matrix {
    protected:
        vector< vector<Numeric> > _mat;
        int _col, _row;
        const bool usingModulo = true;
        const Numeric modulo = 1000000007; // using modulo
        void resize(int col, int row) {
            _col = col; _row = row;
            _mat.assign(col, vector<Numeric>(row, 0));
        }
    public:
        Matrix(int col, int row) : _col(col), _row(row) {
            _mat.assign(col, vector<Numeric>(row, 0));
        }
        Matrix(int col, int row, int num) : _col(col), _row(row) {
            _mat.assign(col, vector<Numeric>(row, num));
        }
        int col() const { return _col; }
        int row() const { return _row; }
        vector<vector<Numeric>> mat() const {return _mat; }
        vector<Numeric> &operator[](int i) { return _mat[i]; }
        Numeric &operator() (int i, int j) { return _mat[i][j]; }
        Matrix<Numeric> &operator=(Matrix<Numeric> x) {
            this->_mat = x.mat();
            return *this;
        }
        Matrix<Numeric> operator+(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "+"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret[i][j] = _mat[i][j] + x[i][j];
                    if (usingModulo) ret[i][j] %= modulo;
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator+=(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "+"; x.size(true);
                exit(0);
            }
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    _mat[i][j] += x[i][j];
                    if (usingModulo) _mat[i][j] %= modulo;
                }
            }
            return *this;
        }
        Matrix<Numeric> operator-(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "-"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret[i][j] = _mat[i][j] - x[i][j];
                    if (usingModulo) ret[i][j] %= modulo;
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator-=(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "-"; x.size(true);
                exit(0);
            }
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    _mat[i][j] -= x[i][j];
                    if (usingModulo) _mat[i][j] %= modulo;
                }
            }
            return *this;
        }
        Matrix<Numeric> operator*(Matrix<Numeric> &x) {
            if (this->row() != x.col()) {
                cout << "cannot multiply matrices .. ";
                this->size(false); cout << "*"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), x.row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < x.row(); ++j) {
                    for (int k = 0; k < this->row(); ++k) {
                        ret[i][j] += _mat[i][k] * x[k][j];
                        if (usingModulo) ret[i][j] %= modulo;
                    }
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator*(Numeric k) {
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret(i, j) = _mat[i][j] * k;
                    if (usingModulo) ret(i, j) %= modulo;
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator*=(Matrix<Numeric> &x) {
            if (this->row() != x.col()) {
                cout << "cannot multiply matrices .. ";
                this->size(false); cout << "*"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), x.row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < x.row(); ++j) {
                    for (int k = 0; k < this->row(); ++k) {
                        ret[i][j] += _mat[i][k] * x[k][j];
                        if (usingModulo) ret[i][j] %= modulo;
                    }
                }
            }
            this->resize(this->col(), x.row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < x.row(); ++j) {
                    _mat[i][j] = ret[i][j];
                }
            }
            return *this;
        }
        Matrix<Numeric> &operator*=(Numeric k) {
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    _mat[i][j] *= k;
                    if (usingModulo) _mat %= modulo;
                }
            }
            return *this;
        }
        Numeric sum() {
            Numeric ret = 0;
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret += _mat[i][j];
                    if (usingModulo) ret %= modulo;
                }
            }
            return ret;
        }
        void print() {
            cout << "-- print "; this->size(false); cout << " --" << endl;
            for (int i = 0; i < _col; ++i) {
                for (int j = 0; j < _row; ++j) {
                    if (j != 0) cout << "\t";
                    cout << _mat[i][j];
                }
                cout << endl;
            }
            cout << "------------------" << endl;
        }
        void print(string str) {
            cout << "-- print \"" << str << "\" "; this->size(false); cout << " --" << endl;
            for (int i = 0; i < _col; ++i) {
                for (int j = 0; j < _row; ++j) {
                    if (j != 0) cout << "\t";
                    cout << _mat[i][j];
                }
                cout << endl;
            }
            cout << "------------------" << endl;
        }
        void size (bool endline = true) const {
            cout << "(" << this->col() << ", " << this->row() << ")";
            if (endline) cout << endl;
        }
};

template<class Numeric> class SquareMatrix : public Matrix<Numeric> {
    private:
    public:
        SquareMatrix(int col): Matrix<Numeric>(col, col){
        }
        SquareMatrix(int col, int num): Matrix<Numeric>(col, col, num) {
        }
        SquareMatrix(int col, bool identity): Matrix<Numeric>(col, col) {
            if (identity) {
                for (int i = 0; i < col; ++i) {
                    this->_mat[i][i] = 1;
                }
            }
        }
};

int main(){
    int n; long long k; cin >> n >> k;
    Matrix<long long> ans(n, 1, 1), a(n, n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> a[i][j];
        }
    }
    while (k) {
        if (k & 1) {
            ans = a * ans; 
        }
        a *= a;
        k /= 2;
    }
    cout << ans.sum() << endl; 
    return 0;
}


Measured memory_bytes: 256