#include<bits/stdc++.h>
#define REP(i,a,n) for(int i=a;i<(int)(n);++i)
using namespace std;
int fa[40],sz[40];
int findfa(int x){return fa[x]==x? x:fa[x]=findfa(fa[x]);}
void merge(int x,int y){
x=findfa(x);y=findfa(y);
if(x!=y)fa[x]=y,sz[y]+=sz[x];
}
vector<bool>receive_message(vector<vector<bool>>a){
int n=31;
vector<vector<bool>>vis(66,vector<bool>(n,0));
vector<bool>ans(1025,0),c(31,0);
vector<int>lst(n,-1),nxt(n,-1),deg(n,0);
REP(i,0,n)fa[i]=i,sz[i]=1;
REP(i,0,n){
REP(j,0,n-1)if(a[j][i]){
lst[i]=j;nxt[i]=(i+j+1)%n;++deg[nxt[i]];
break;
}
}
queue<int>q;
REP(i,0,n)if(!deg[i])q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
if(nxt[x]!=-1){
--deg[nxt[x]];
if(!deg[nxt[x]])q.push(nxt[x]);
}
}
REP(i,0,n)if(deg[i]&&nxt[i]!=-1)merge(i,nxt[i]);
REP(i,0,n)if(sz[findfa(i)]==16)c[i]=1;
// REP(i,0,n)cout<<!c[i];
// cout<<endl;
REP(i,0,n)if(c[i]){
REP(j,0,lst[i]+1)vis[j][i]=1;
}
int cur=0,l=0;
REP(i,0,66){
REP(j,0,n)if(c[j]&&!vis[i][j]){
ans[cur++]=a[i][j];
if(a[i][j])l=cur-1;
}
}
vector<bool>ret(l,0);
REP(i,0,l)ret[i]=ans[i];
return ret;
}
void send_message(vector<bool>a,vector<bool>b){
int n=31;
vector<vector<bool>>vis(66,vector<bool>(n,0)),res(66,vector<bool>(n,0));
REP(i,0,n)if(!b[i]){
int lst=i+1;
REP(j,0,n)if(!b[(i+j+1)%n]){lst=j;break;}
REP(j,0,lst+1)vis[j][i]=1;
res[lst][i]=1;
}
vector<bool>ans(1025,0);
REP(i,0,a.size())ans[i]=a[i];
ans[a.size()]=1;auto it=ans.begin();
REP(i,0,66){
REP(j,0,n)if(!b[j]&&!vis[i][j]){
res[i][j]=*it;it++;
}
}
for(auto i:res)send_package(i);
}