#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
const int N=1e3+1,M=1e4+1,inf=1e9;
int n,m,s,t,tot,ans,match[N];
int h[N],h2[N],dep[N];
bool tagl[N],tagr[N],del[N];
bitset<N>vis[N];
struct Edge{
int to,nxt,cap,flow;
}e[M*2];
void add(int u,int v,int w){
e[tot].to=v,e[tot].nxt=h[u],e[tot].cap=w,e[tot].flow=0;
h[u]=tot++;
e[tot].to=u,e[tot].nxt=h[v];
h[v]=tot++;
}
int bfs(){
queue<int>q;
q.push(s),memset(dep,0,sizeof(dep)),dep[s]=1;
while(q.size()){
int u=q.front();
q.pop();
for(int i=h[u];~i;i=e[i].nxt){
int v=e[i].to;
if(!dep[v]&&e[i].cap>e[i].flow)
dep[v]=dep[u]+1,q.push(v);
}
}
return dep[t];
}
int dfs(int u,int flow){
if(u==t||!flow)
return flow;
int sum=0;
for(int& i=h2[u];~i;i=e[i].nxt){
int v=e[i].to,d;
if(dep[v]==dep[u]+1){
d=dfs(v,min(flow-sum,e[i].cap-e[i].flow));
sum+=d,e[i].flow+=d,e[i^1].flow-=d;
if(sum==flow)
break;
}
}
return sum;
}
void dfs_(int u){
tagr[u]=1;
for(int i=1;i<=n;i++)
if(vis[i][u]&&!tagl[i])
tagl[i]=1,dfs_(match[i]);
}
signed main(){
n=read(),m=read();
t=2*n+1;
memset(h,-1,sizeof(h));
for(int i=1;i<=n;i++)
add(s,i,1),add(i+n,t,1);
for(int i=1;i<=m;i++){
int u=read(),v=read();
vis[u][v]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(vis[i][j])
vis[j]|=vis[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(vis[i][j])
add(i,j+n,1);
while(bfs()){
memcpy(h2,h,sizeof(h));
ans+=dfs(s,inf);
}
write(ans),putchar('\n');
for(int i=1;i<=n;i++)
if(e[(i-1)*4].flow)
for(int j=h[i];~j;j=e[j].nxt)
if(e[j].flow)
match[i]=e[j].to-n;
for(int i=1;i<=n;i++)
if(!e[i*4-2].flow)
dfs_(i);
for(int i=1;i<=n;i++)
write(!tagl[i]&&tagr[i]);
putchar('\n');
for(int i=1;i<=n;i++){
int sum=0,cnt=0;
tot=0,memset(h,-1,sizeof(h)),memset(del,0,sizeof(del));
for(int j=1;j<=n;j++)
del[j]=vis[i][j]||vis[j][i]||i==j;
for(int j=1;j<=n;j++)
if(!del[j])
add(s,j,1),add(j+n,t,1),cnt++;
for(int j=1;j<=n;j++)
if(!del[j])
for(int k=1;k<=n;k++)
if(vis[j][k]&&!del[k])
add(j,k+n,1);
while(bfs()){
memcpy(h2,h,sizeof(h));
sum+=dfs(s,inf);
}
write(cnt-sum==ans-1);
}
return 0;
}