var
gx:array[1..1000,1..1000] of boolean;
a,b:array[1..1000] of byte;
sold,k,l,n,m,q,p:longint;
function panduan(j:longint):boolean;
var
dis:boolean;
i:longint;
begin
dis:=true;
for i:=1 to n do
if (gx[i,j]=false)and(a[i]=1) then
dis:=false;
panduan:=dis;
end;
procedure search(t,numb:longint);
var
i:longint;
begin
if t>n then
begin
if sold<numb then
begin
for l:=1 to n do
b[l]:=a[l];
sold:=numb;
end;
exit;
end;
for i:=t to n do
if panduan(i) then
begin
a[i]:=1;
numb:=numb+1;
search(i+1,numb);
a[i]:=0;
numb:=numb-1;
end;
end;
begin
readln(n,m);
fillchar(gx,sizeof(gx),true);
for k:=1 to m do
begin
readln(q,p);
gx[q,p]:=false;
end;
for l:=1 to n do
begin
a[l]:=0;
b[l]:=0;
end;
sold:=0;
search(1,0);
writeln(sold);
for k:=1 to n do
write(b[k],' ');
end.
gx:array[1..1000,1..1000] of boolean;
a,b:array[1..1000] of byte;
sold,k,l,n,m,q,p:longint;
function panduan(j:longint):boolean;
var
dis:boolean;
i:longint;
begin
dis:=true;
for i:=1 to n do
if (gx[i,j]=false)and(a[i]=1) then
dis:=false;
panduan:=dis;
end;
procedure search(t,numb:longint);
var
i:longint;
begin
if t>n then
begin
if sold<numb then
begin
for l:=1 to n do
b[l]:=a[l];
sold:=numb;
end;
exit;
end;
for i:=t to n do
if panduan(i) then
begin
a[i]:=1;
numb:=numb+1;
search(i+1,numb);
a[i]:=0;
numb:=numb-1;
end;
end;
begin
readln(n,m);
fillchar(gx,sizeof(gx),true);
for k:=1 to m do
begin
readln(q,p);
gx[q,p]:=false;
end;
for l:=1 to n do
begin
a[l]:=0;
b[l]:=0;
end;
sold:=0;
search(1,0);
writeln(sold);
for k:=1 to n do
write(b[k],' ');
end.