#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
stack<int> s;
vector<int> g[maxn];
int low[maxn];
int dfn[maxn];
bool vis[maxn];
bool instack[maxn];
int n,m,t;
int ans = 0;
void tarjan(int u){
dfn[u] = low[u] = ++t;
vis[u] = 1;
s.push(u);
instack[u] = 1;
for(int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if(vis[v]==0){
tarjan(v);
low[u] = min(low[u],low[v]);
}else if(instack[v]){
low[u] = min(low[u],low[v]);
}
}
int m;
int num = 0;
if(dfn[u]==low[u]){
do{
num++;
m = s.top();
s.pop();
instack[m] = 0;
}while(m!=u);
}
if(num>1){
ans += num*(num-1)/2;
}
}
int main(void){
cin >> n >> m;
for(int i = 1; i <= m; i++){
int u,v;
cin >> u >> v;
g[u].push_back(v);
}
for(int i = 1; i <= n; i++){
if(vis[i]==0){
vis[i] = 1;
tarjan(i);
}
}
cout<<ans<<endl;
return 0;
}