//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma,sse,sse2,sse3,sse4") /* q,n <= 200000 */
//#pragma GCC optimization ("O3")
//#pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
using namespace std ;
/*
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update > ordered_set;
#define index(a) order_of_key(a)
#define _value(a) find_by_order(a)
 */
#define PIE acos(-1)
#define rl(i,n)        for(int i=0;i<n;i++)
#define ll             long long int
#define ld             long double
#define pb             push_back
#define all(v)         v.begin(),v.end()
#define sz(a)          (int)((a).size())
#define IOS            ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define edl             "\n"
#define lll __uint128_t
#define bit_count(n) bitcount(n)
using namespace std;
inline ll __gcd(ll a,ll b);
void pdash(int n=1);int bitcount(ll u);
ll power(ll x,ll y);ll power(ll x,ll y,ll z);
ll modInverse(ll n,ll p);ll nCrF(ll n,ll r,ll p);
vector<int > cordinate_compression(vector<int>& v);   // return access vector so that we can keep track of real entity;
void make_uniquee(vector<int>& vec);        // notice the strange fn_name
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll myrand(ll mod=1000000009);
void custome_random_shuffle(vector<int>& vec){shuffle(all(vec),rng);return;}
void svec(vector<int>& vec);void smap(vector<int,int>& mp);void sset(set<int >& st);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void solve()
{
    int n,m;cin>>n>>m;
    vector<string >vec(n+1);
    string str;
    for(int i=1;i<=n;i++)
    {
        cin>>str;
        str="#"+str;
        vec[i]=str;
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)if(i^j and vec[i][j]==vec[j][i])
        {
            cout<<"YES\n";
            cout<<i<<" ";
            for(int k=0;k<m;k++)if(k%2==0)cout<<j<<" ";else cout<<i<<" ";cout<<edl;
            return;
        }
    }
    if(n==2){
        if(vec[1][2]!=vec[2][1] and m%2==0){cout<<"NO\n";return;}
        cout<<"YES\n";
        cout<<"2 ";
        for(int j=1;j<=m;j++){if(j%2)cout<<"1 ";else cout<<"2 ";}cout<<edl;
        return;
    }
    cout<<"YES\n";
    if(vec[1][2]==vec[2][3] and vec[2][3]==vec[3][1]){
        cout<<"1 ";
        for(int j=1;j<=m;j++){
            if(j%3==0){cout<<"1 ";}else if(j%3==1)cout<<"2 ";else cout<<"3 ";
        }cout<<edl;
        return;
    }
    map<int,int>mp;
    set<int >st;st.insert(1);st.insert(2);st.insert(3);
    st.erase(6);
    st.erase(7);
    for(int i=0;i<3;i++)
    if(vec[i+1][(i+1)%3+1]==vec[(i+1)][(i+2)%3+1])
    {
        if(vec[i+1][(i+1)%3+1]=='a'){mp[3]=i+1;st.erase(i+1);}
        if(vec[i+1][(i+1)%3+1]=='b'){mp[2]=i+1;st.erase(i+1);}
    }
    mp[1]=(*st.begin());st.clear();

    switch (m%4) {
        case 0:
            cout<<mp[1]<<" ";
            for(int i=1;i<=m/4;i++){cout<<mp[2]<<" "<<mp[1]<<" ";}
            for(int i=1;i<=m/4;i++){cout<<mp[3]<<" "<<mp[1]<<" ";}
            cout<<edl;
                   break;
        case 1:
          cout<<mp[3]<<" ";
            for(int i=1;i<=m/4;i++){cout<<mp[2]<<" "<<mp[3]<<" ";}
            cout<<mp[1]<<" ";
            for(int i=1;i<=m/4;i++){cout<<mp[3]<<" "<<mp[1]<<" ";}
            cout<<edl;
                   break;
        case 2:
            cout<<mp[3]<<" ";
            for(int i=1;i<=m/4;i++){cout<<mp[2]<<" "<<mp[3]<<" ";}
            cout<<mp[1]<<" "<<mp[2]<<" ";
            for(int i=1;i<=m/4;i++){cout<<mp[1]<<" "<<mp[2]<<" ";}
            cout<<edl;

                   break;
        case 3:
            cout<<mp[3]<<" ";
            for(int i=1;i<=m/4+1;i++){cout<<mp[2]<<" "<<mp[3]<<" ";}
            cout<<mp[1]<<" ";
            for(int i=1;i<=m/4;i++){cout<<mp[3]<<" "<<mp[1]<<" ";}
            cout<<edl;

                   break;
    }



}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
        IOS;  //comment it when in interactive
        int t=1;
        cin>>t;
    while(t--){
        solve();}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/*
                                        * do smth instead of nothing and stay organized
*/



inline ll __gcd(ll a,ll b){if(a==0||b==0){return a+b;}ll tempa,tempb;while(1){if(a%b==0)return b;else{tempa=a;tempb=b;a=tempb;b=tempa%tempb;}}}
void pdash(int n){for(int i=0;i<n;i++){for(int j=0;j<30;j++){cout<<"-";}cout<<edl;}}
ll power(ll x,ll y){ll result =1;while(y>0){if(y&1){result=(result*x);}y=y>>1;x=(x*x);}return result;}
ll power(ll x,ll y,ll z){ll result =1;x=x%z;while(y>0){if(y&1){result=(result*x)%z;}y=y>>1;x=(x*x)%z;}return result;}
ll modInverse(ll n,ll p){return power(n, p-2, p);}
ll nCrF(ll n,ll r,ll p){if(r==0)return 1;vector<ll>f(n+1);f[0]=1;for(ll i=1;i<=n;i++)f[i]=f[i-1]*i%p;
    return (f[n]*modInverse(f[r],p)%p*modInverse(f[n-r],p)%p)%p;}
vector<int > cordinate_compression(vector<int>& v){vector<int >p=v;make_uniquee(p);rl(i,sz(v))v[i]=(int)(lower_bound(all(p),v[i])-p.begin());return p;}
ll myrand(ll mod) {return rng()%mod;}
void make_uniquee(vector<int>& vec){sort(all(vec));vec.erase(unique(all(vec)),vec.end());}
int bitcount(ll u){int cnt=0;while(u){u=u&(u-1);cnt++;}return cnt;}
void svec(vector<int>& vec)
{cout<<"{\n";rl(i,sz(vec))cout<<"["<<i<<"]  = "<<vec[i]<<edl;cout<<"}\n";}
void sset(set<int>& st){cout<<"{\n";for(auto& j: st){cout<<j<<edl;}cout<<"}\n";}
void smap(map<int,int>& mp){cout<<"{\n";for(auto& j: mp)cout<<"["<<j.first<<"]  = "<<j.second<<edl;cout<<"}\n";}
