uses math;
const fi = '';
fo = '';
maxN = 20005;
maxM = 50005;
var u, v : array[0..maxM] of longint;
ke : array[0..2*maxM] of longint;
dau, is_khop : array[0..maxN] of longint;
n, m, dfscount, rootcon, rootvertex, nCon : longint;
num, low : array[0..maxN] of longint;
procedure init;
var i : longint;
begin
readln(n,m);
for i:=1 to m do
begin
readln(u[i],v[i]);
inc(dau[u[i]]);
inc(dau[v[i]]);
end;
for i:=2 to n do dau[i]:=dau[i-1]+dau[i];
dau[n+1]:=2*m;
for i:=1 to m do
begin
ke[dau[u[i]]]:=v[i];
ke[dau[v[i]]]:=u[i];
dec(dau[u[i]]);
dec(dau[v[i]]);
end;
end;
procedure visit(u : longint);
var v, i :longint;
begin
inc(dfscount);
low[u]:=dfscount; num[u]:=dfscount;
for i:=dau[u]+1 to dau[u+1] do
begin
v:=ke[i];
if num[v]=0 then
begin
if u = rootvertex then inc(rootcon);
visit(v);
if low[v] >= num[u] then inc(is_khop[u])
else low[u]:=min(low[u],low[v]);
end
else low[u]:=min(low[u],num[v]);
end;
end;
procedure solve;
var u : longint;
begin
dfscount:=0; nCon:=0;
fillchar(is_khop,sizeof(is_khop),0);
fillchar(num,sizeof(num),0);
for u:=1 to n do
if num[u]=0 then
begin
inc(nCon);
visit(u);
dec(is_khop[u]);
end;
for u:=1 to n do writeln(is_khop[u]+nCon);
end;
begin
assign(input,fi);reset(input);
assign(output,fo);rewrite(output);
init;
solve;
close(input);close(output);
end.
dXNlcyBtYXRoOwpjb25zdCBmaSA9ICcnOwogICAgICBmbyA9ICcnOwogICAgICBtYXhOID0gMjAwMDU7CiAgICAgIG1heE0gPSA1MDAwNTsKdmFyICB1LCB2IDogYXJyYXlbMC4ubWF4TV0gb2YgbG9uZ2ludDsKICAgICBrZSA6IGFycmF5WzAuLjIqbWF4TV0gb2YgbG9uZ2ludDsKICAgICBkYXUsIGlzX2tob3AgOiBhcnJheVswLi5tYXhOXSBvZiBsb25naW50OwogICAgIG4sIG0sIGRmc2NvdW50LCByb290Y29uLCByb290dmVydGV4LCBuQ29uIDogbG9uZ2ludDsKICAgICBudW0sIGxvdyA6IGFycmF5WzAuLm1heE5dIG9mIGxvbmdpbnQ7CiAKcHJvY2VkdXJlIGluaXQ7CnZhciBpIDogbG9uZ2ludDsKYmVnaW4KICByZWFkbG4obixtKTsKICBmb3IgaTo9MSB0byBtIGRvCiAgICBiZWdpbgogICAgICByZWFkbG4odVtpXSx2W2ldKTsKICAgICAgaW5jKGRhdVt1W2ldXSk7CiAgICAgIGluYyhkYXVbdltpXV0pOwogICAgZW5kOwogIGZvciBpOj0yIHRvIG4gZG8gZGF1W2ldOj1kYXVbaS0xXStkYXVbaV07CiAgZGF1W24rMV06PTIqbTsKIAogIGZvciBpOj0xIHRvIG0gZG8KICAgIGJlZ2luCiAgICAgIGtlW2RhdVt1W2ldXV06PXZbaV07CiAgICAgIGtlW2RhdVt2W2ldXV06PXVbaV07CiAgICAgIGRlYyhkYXVbdVtpXV0pOwogICAgICBkZWMoZGF1W3ZbaV1dKTsKICAgIGVuZDsKZW5kOwogCnByb2NlZHVyZSB2aXNpdCh1IDogbG9uZ2ludCk7CnZhciB2LCBpIDpsb25naW50OwpiZWdpbgogIGluYyhkZnNjb3VudCk7CiAgbG93W3VdOj1kZnNjb3VudDsgIG51bVt1XTo9ZGZzY291bnQ7CiAgZm9yIGk6PWRhdVt1XSsxIHRvIGRhdVt1KzFdIGRvCiAgIGJlZ2luCiAgICB2Oj1rZVtpXTsKICAgICBpZiBudW1bdl09MCB0aGVuCiAgICAgICBiZWdpbgogICAgICAgICBpZiB1ID0gcm9vdHZlcnRleCB0aGVuIGluYyhyb290Y29uKTsKICAgICAgICAgdmlzaXQodik7CiAgICAgICAgIGlmIGxvd1t2XSA+PSBudW1bdV0gdGhlbiBpbmMoaXNfa2hvcFt1XSkKICAgICAgICAgZWxzZSBsb3dbdV06PW1pbihsb3dbdV0sbG93W3ZdKTsKICAgICAgIGVuZAogICAgICBlbHNlIGxvd1t1XTo9bWluKGxvd1t1XSxudW1bdl0pOwogIGVuZDsKZW5kOwogCnByb2NlZHVyZSBzb2x2ZTsKdmFyIHUgOiBsb25naW50OwpiZWdpbgogIGRmc2NvdW50Oj0wOyBuQ29uOj0wOwogIGZpbGxjaGFyKGlzX2tob3Asc2l6ZW9mKGlzX2tob3ApLDApOwogIGZpbGxjaGFyKG51bSxzaXplb2YobnVtKSwwKTsKICAgZm9yIHU6PTEgdG8gbiBkbwogICBpZiBudW1bdV09MCB0aGVuCiAgICAgYmVnaW4KICAgICAgIGluYyhuQ29uKTsKICAgICAgIHZpc2l0KHUpOwogICAgICAgZGVjKGlzX2tob3BbdV0pOwogICAgICBlbmQ7CiAKICBmb3IgdTo9MSB0byBuIGRvICB3cml0ZWxuKGlzX2tob3BbdV0rbkNvbik7CmVuZDsKIApiZWdpbgogIGFzc2lnbihpbnB1dCxmaSk7cmVzZXQoaW5wdXQpOwogIGFzc2lnbihvdXRwdXQsZm8pO3Jld3JpdGUob3V0cHV0KTsKICAgIGluaXQ7CiAgICBzb2x2ZTsKICBjbG9zZShpbnB1dCk7Y2xvc2Uob3V0cHV0KTsKZW5kLg==