#include #include using namespace std; using namespace atcoder; typedef long long int ll; typedef long double ld; typedef vector vi; typedef vector vvi; typedef vector vvvi; typedef vector vvvvi; typedef pair pi; typedef pair ppi; typedef pair pppi; typedef pair ppppi; #define FOR(i,l,r) for(ll i=l;i=l;i--) #define RREP(i,n) RFOR(i,0,n) #define ALL(x) x.begin(),x.end() #define F first #define S second #define BS(A,x) binary_search(ALL(A),x) #define LB(A,x) (ll)(lower_bound(ALL(A),x)-A.begin()) #define UB(A,x) (ll)(upper_bound(ALL(A),x)-A.begin()) #define COU(A,x) (UB(A,x)-LB(A,x)) #define sz(c) ((ll)(c).size()) /* #include namespace mp=boost::multiprecision; using Bint=mp::cpp_int; */ templateusing min_priority_queue=priority_queue,greater>; templateostream&operator<<(ostream&os,pair&p){os<istream&operator>>(istream&is,pair&p){is>>p.F>>p.S;return is;} templateostream&operator<<(ostream&os,vector&v){REP(i,sz(v))os<istream&operator>>(istream&is,vector&v){for(T&in:v)is>>in;return is;} templatebool chmax(T&a,T b){if(abool chmin(T&a,T b){if(b vm; typedef vector vvm; typedef vector vvvm; typedef vector vvvvm; ostream&operator<<(ostream&os,mint&a){os<>N>>M; vvi A(N,vi(N)); cin>>A; REP(i,N){ ll s=0; REP(j,N)s+=A[i][j]; if(s!=M){cout<<-1<>S(N),T(N); REP(j,N)REP(k,N)if(A[j][k]){ S[j].insert(k); T[k].insert(j); } ll c=0; setX,Y; REP(i,N)X.insert(i); REP(i,N)Y.insert(i); while(cxx,yy; for(auto j:X)if(sz(S[j])==1){ ll t=*S[j].begin(); ans[j]=t+1; for(auto x:S[j])if(x!=t)T[x].erase(j); for(auto x:T[t])if(x!=j)S[x].erase(t); S[j].clear(); T[t].clear(); c++; xx.insert(j);yy.insert(t); } for(auto i:xx)X.erase(i); for(auto i:yy)Y.erase(i); xx.clear();yy.clear(); for(auto j:Y)if(sz(T[j])==1){ ll t=*T[j].begin(); ans[t]=j+1; for(auto x:S[t])if(x!=j)T[x].erase(t); for(auto x:T[j])if(x!=t)S[x].erase(j); S[t].clear(); T[j].clear(); c++; xx.insert(t); yy.insert(j); } for(auto i:xx)X.erase(i); for(auto i:yy)Y.erase(i); if(c==d){ for(auto j:X)if(sz(S[j])&&ans[j]==0){ ll t=*S[j].begin(); ans[j]=t+1; for(auto x:S[j])if(x!=t)T[x].erase(j); for(auto x:T[t])if(x!=j)S[x].erase(t); S[j].clear(); T[t].clear(); c++; X.erase(j); Y.erase(t); break; } } } REP(j,N)A[j][ans[j]-1]--; cout<