对于10% 的数据,n <= 10;m <= 50
对于40% 的数据,n <= 500;m <= 1000
对于另外10% 的数据,数据中保证没有重边且m = n^2
对于100% 的数据,n<= 50000;m <= 600000
var
a,b,i,j,p1,time:longint;
v,x,y,low,dfn:array[0..600000] of longint;
last:array[0..600000,1..2]of longint;
p:array[0..600000]of boolean;
ans,ans1:int64;
function min(i,j:longint):longint;
begin
if i<j then
exit(i);
exit(j);
end;
function max(i,j:longint):longint;
begin
if i<j then
exit(j);
exit(i);
end;
procedure dfs(x:longint);
var
i,j,r:longint;
begin
inc(p1);
v[p1]:=x;
r:=last[x,1];
inc(time);
low[x]:=time;
dfn[x]:=time;
p[x]:=true;
while r<>0 do
begin
if dfn[y[r]]=0 then
begin
dfs(y[r]);
low[x]:=min(low[x],low[y[r]]);
end
else
if p[y[r]] then low[x]:=min(low[x],low[y[r]]);
r:=last[r,2];
end;
ans1:=0;
if dfn[x]=low[x] then
begin
while v[p1+1]<>x do
begin
p[v[p1]]:=false;
inc(ans1);
dec(p1);
end;
ans:=ans+ans1*(ans1-1) div 2;
end;
end;
begin
readln(a,b);
for i:=1 to b do
begin
readln(x[i],y[i]);
last[i,2]:=last[x[i],1];
last[x[i],1]:=i;
end;
for i:=1 to a do
if dfn[i]=0 then dfs(i);
writeln(ans);
close(input);
end.