#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int mat1[51][51],mat2[51][51],mat3[51][51],kume[55],st[55];
int dim1,dim2,maxcardinalyty,sonucdim;
int durum[51],tempmat[51][51];

void Readfromfiles(string str1,string str2)
{
	ifstream f1(str1.c_str());
	ifstream f2(str2.c_str());
	int i,j;
	f1>>dim1;
	f2>>dim2;
	if(dim2>dim1)
	{
		f1.close();
		f2.close();
		f1.open(str2.c_str());
		f2.open(str1.c_str());
		f1>>dim1;
		f2>>dim2;
	}

	for(i=0;i<dim1;i++)
		for(j=0;j<dim1;j++)
			f1>>mat1[i][j];

	for(i=0;i<dim2;i++)
		for(j=0;j<dim2;j++)
			f2>>mat2[i][j];
	f1.close();
	f2.close();
}

int Satirbos(int satirnum)
{
	for(int i=0;i<dim2;i++)
		if(mat3[satirnum][i]==1)
			return 0;
	return 1;
}

void SatirSutunBoya(int satirnum)
{
	for(int i=0;i<dim2;i++)
	{
		mat3[satirnum][i]=2;
		mat3[i][satirnum]=2;
	}
}

void Duzenle()
{
	int i;
	for(i=0;i<dim2;i++)
		if(Satirbos(i))
		{
			SatirSutunBoya(i);
			sonucdim--;
		}
}

void Traverse(int yer)
{
	int i;
	durum[yer]=1;
	for(i=0;i<dim2;i++)
		if(!durum[i] && tempmat[yer][i])
			Traverse(i);
}

int Con_Satirbos(int satirnum)
{
	for(int i=0;i<dim2;i++)		
		if(tempmat[satirnum][i])
			return 0;
	return 1;	
}

int Connected()
{
	int i,j;
	for(i=0;i<dim2;i++)
		durum[i]=0;
	for(i=0;i<dim2;i++)
		for(j=0;j<i;j++)
				if(mat2[i][j] && mat1[st[i]][st[j]])
					tempmat[i][j]=tempmat[j][i]=1;
				else 
					tempmat[i][j]=tempmat[j][i]=0;

	for(i=0;i<dim2;i++)
		if(Con_Satirbos(i))
			durum[i]=2;
	for(i=0;i<dim2;i++)
		if(!durum[i])
		{
			Traverse(i);
			break;
		}

	for(i=0;i<dim2;i++)
		if(!durum[i])
			return 0;
	return 1;
}

void Kontrol()
{
	register int j,i,tmpcardinalyty=0;
	
	for(i=0;i<dim2;i++)
		for(j=0;j<i;j++)
			if(mat2[i][j] && mat1[st[i]][st[j]])
				tmpcardinalyty++;

	if(tmpcardinalyty>maxcardinalyty && Connected())
	{
		maxcardinalyty=tmpcardinalyty;
		for(i=0;i<dim2;i++)
			for(j=0;j<dim2;j++)
				mat3[i][j]=tempmat[i][j];
	}
}

void Coz()
{
	int yer=0,i;
	
	for(i=0;i<=dim2;i++)
		st[i]=-1;
	
	for(;;)
	{
		if(yer==dim2)
		{
			Kontrol();
			yer--;
			goto mylabel;
		}
		
		for(i=st[yer]+1;i<dim1;i++)
			if(!kume[i])
			{
				if(st[yer]>=0)
					kume[st[yer]]=0;
				kume[i]=1;
				st[yer]=i;
				yer++;
				goto mylabel;
			}
		if(st[yer]>=0)
			kume[st[yer]]=0;
		st[yer]=-1;
		if(yer>0)
			yer--;
		else 
			break;
		mylabel:;
	}
}

void Yazdir()
{
	ofstream f1("output.dat");
	int i,j,flag;
	f1<<sonucdim<<endl;
	for(i=0;i<dim2;i++)
	{
		flag=0;
		for(j=0;j<dim2-1;j++)
			if(mat3[i][j]!=2)
			{
				f1<<mat3[i][j]<<" ";
				flag=1;
			}
			if(mat3[i][j]!=2)
				f1<<mat3[i][j];
		if(flag)
			f1<<endl;
	}
	f1.close();
}

int main(int argc,char *argv[])
{
	string str1,str2;
	str1=argv[1];
	str2=argv[2];
	Readfromfiles(str1,str2);
	Coz();
	sonucdim=dim2;
	Duzenle();
	Yazdir();
	return 0;
}
