/*这题后面那个visit的判断有点浪费时间。没有优化好。。后来看了飞神的解题报告,在DFS算法中进行优化
for(i=0; i<n; i++)
{
if(!color[i]&&map[x][i])
{
color[i]=-color[x];
if(dfs(i,n))
return 1;
else
return 0;
}
else if(color[i]&&map[x][i]&&color[x]==color[i])
{
return 0;
}
}
*/
#include<iostream>
#include<memory.h>
using namespace std;
int m[210][210];
int color[210];
int n;
void dfs(int x,int n)
{
int i;
for(i=0;i<n;i++)
{
if(m[x][i]==1 && !color[i])
{
color[i]=-color[x];
dfs(i,n);
}
}
}
int main()
{
int t,a,b,flag,i,j;
while(cin>>n && n)
{
flag=0;
memset(m,0,sizeof(m));
memset(color,0,sizeof(color));
cin>>t;
while(t--)
{
cin>>a>>b;
m[a][b]=1;
m[b][a]=1;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(j==n-1)
cout<<m[i][j]<<endl;
else
cout<<m[i][j]<<" ";
color[0]=1;
dfs(0,n);
for(i=0;i<n;i++)
if(i==n-1) cout<<color[i]<<endl;
else cout<<color[i]<<" ";
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(m[i][j]==1)
{
if(color[i]!=color[j])
continue;
else
{
flag=1;
break;
}
}
}
if(flag==1)
break;
}
if(flag==1)
cout<<"NOT BICOLORABLE."<<endl;
else
cout<<"BICOLORABLE."<<endl;
}
return 0;
}