#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int uni[N],dis[N],sz[N][3],n,m,tag[N],num[N],deg[N];
long long ans;
int getfa(int pos) {
  if (uni[pos] == pos) return pos;
  int ret = getfa(uni[pos]);
  (dis[pos] += dis[uni[pos]]) %= 3;
  return uni[pos] = ret;
}
int main() {
  int x,y,a,b;
  scanf("%d%d",&n,&m);
  for (int i = 1 ; i <= n ; ++ i)
    uni[i] = i, dis[i] = 0;
  for (int i = 1 ; i <= m ; ++ i) {
    scanf("%d%d",&x,&y);
    a = getfa(x), b = getfa(y);
    ++ deg[x];
    ++ deg[y];
    if (a != b) {
      uni[b] = a;
      dis[b] = (dis[x] + 4 - dis[y]) % 3;
    } else {
      if ((dis[y] - dis[x] + 3) % 3 == 1);
      else tag[a] = 1;
    }
  }
  for (int i = 1 ; i <= n ; ++ i) {
    num[getfa(i)] += deg[i];
    tag[getfa(i)] |= tag[i];
    sz[getfa(i)][(dis[i] + 3) % 3] ++;
  }
  for (int i = 1 ; i <= n ; ++ i) {
    if (getfa(i) != i) continue;
    if (tag[i]) ans += 1ll * (sz[i][0] + sz[i][1] + sz[i][2]) * (sz[i][0] + sz[i][1] + sz[i][2]);
    else {
      if ((!sz[i][0]) || (!sz[i][1]) || (!sz[i][2]))
	ans += num[i] / 2;
      else
	ans += 1ll * sz[i][0] * sz[i][1] + 1ll * sz[i][1] * sz[i][2] + 1ll * sz[i][2] * sz[i][0];
    }
  }
  cout << ans << endl;
  return 0;
}
