const LL P =1e9+7;typedef vector<LL> vec;typedef vector<vec> mat;voidprint(mat A){rep(i, A.size()){rep(j, A[0].size()) cout << A[i][j]<<' ';
cout << endl;}}
mat operator*(mat A, mat B){
mat C(A.size(),vec(B[0].size()));rep(i, A.size())rep(k, B.size())rep(j, B[0].size()){(C[i][j]+= A[i][k]* B[k][j])%= P;}return C;}
mat qpow(mat A, LL y){
mat ret(A.size(),vec(A.size()));rep(i, A.size()) ret[i][i]=1;for(; y; y >>=1, A = A * A)if(y &1) ret = ret * A;return ret;}