type enode=record
v,n:longint;
end;
const maxn=10001;
maxm=50001;
type node=array[0..maxn] of longint;
var st,ins,low,dfn,num,idx:node;
didx,ccnt,top:longint;
e:array[0..maxm] of enode;
h:array[0..maxn] of longint;
cnt,n,m:longint;
procedure add(u,v:longint);
begin
inc(cnt);
e[cnt].v:=v;
e[cnt].n:=h[u];
h[u]:=cnt;
end;
function min(a,b:longint):longint;
begin if a>b then exit(b); exit(a); end;
procedure dfs(u:longint);
var v,p:longint;
begin
inc(didx);
low[u]:=didx;
dfn[u]:=didx;
inc(top);
st[top]:=u;
ins[u]:=1;
p:=h[u];
while p<>-1 do
begin
v:=e[p].v;
if dfn[v]=-1 then
begin
dfs(v);
low[u]:=min(low[u],low[v]);
end
else if ins[v]=1 then
low[u]:=min(low[u],dfn[v]);
p:=e[p].n;
end;
if low[u]=dfn[u] then
begin
inc(ccnt); v:=0;
while u<>v do
begin
v:=st[top];
dec(top);
ins[v]:=0;
idx[v]:=ccnt;
inc(num[ccnt]);
end;
end;
end;
procedure tarjan;
var o:longint;
begin
fillchar(low,sizeof(low),255);
fillchar(dfn,sizeof(dfn),255);
fillchar(st,sizeof(st),255);
fillchar(ins,sizeof(ins),0);
fillchar(num,sizeof(num),0);
fillchar(idx,sizeof(idx),0);
ccnt:=0;
for o:=1 to n do
begin
top:=0; didx:=0;
if dfn[o]=-1 then dfs(o);
end;
end;
procedure init;
var i,u,v:longint;
begin
fillchar(h,sizeof(h),255);
readln(n,m);
for i:=1 to m do
begin
readln(u,v);
add(u,v);
end;
end;
begin
Init;
Tarjan;
end.