#include using namespace std; typedef long long ll; typedef pair pi; typedef pair pl; typedef double db; #define ls(x) ((x)<<1) #define rs(x) ((x)<<1|1) #define low(x) ((x)&-(x)) #define all(x) x.begin(),x.end() #define mp make_pair #define X first #define Y second #ifdef _DEBUG const int N=1e3+10; #else const int N=1e6+10; #endif const ll mod=1e9+7; //const ll mod=998244353; inline ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);} inline ll q_pow(ll a,ll x){ll ans=1,tmp=a;while(x){if(x&1)(ans*=tmp)%=mod;(tmp*=tmp)%=mod;x>>=1;}return ans;} template inline void re(T &N){int f=1;char c;while((c=getchar())< '0'||c> '9')if(c=='-')f=-1;N=c-'0';while((c=getchar())>='0'&&c<='9')N=N*10+c-'0';N*=f;} templateinline void re(T&x,T_&...y){re(x),re(y...);} int m,n,t=1,st,en; char s[N]; int deg[N],odd[N]; int p[N]; int find(int x) { if(p[x]==x)return x; return p[x]=find(p[x]); } void merge(int x,int y) { if(find(x)==find(y))return; p[find(x)]=find(y); } int main() { #ifdef _DEBUG freopen("data.txt","r",stdin); #endif re(t); while(t--) { re(n,st); for(int i=1;i<=n;i++)deg[i]=odd[i]=0,p[i]=i; int ans=0; for(int i=2;i<=n;i++) { scanf("%s",s+1); for(int j=1;j< i;j++)if(s[j]=='0') { merge(i,j); deg[i]++;deg[j]++; ans++; } } if(!ans){puts("0");continue;} for(int i=1;i<=n;i++)if(deg[i]&1)odd[find(i)]++; int ok=1; for(int i=1;i<=n;i++) { if(odd[find(i)]> 2){ok=0;break;} if(odd[find(i)]==2&&find(i)!=find(st)){ok=0;break;} } if(odd[find(st)]==2&°[st]%2==0)ok=0; if(!ok){puts("-1");continue;} int cnt=-1; for(int i=1;i<=n;i++)if(deg[i]&&find(i)==i)cnt++; if(!deg[st])cnt++; printf("%d\n",ans+cnt*2); } }