#include <bits/stdc++.h>

const int maxn = 1e5 + 10;
typedef long long ll;
int n, m, i, j, k;
ll ans, hd[maxn], nxt[maxn << 1], ver[maxn << 1], wei[maxn << 1], cnte;
ll col[maxn], a[maxn]; bool succ;
inline void adde(int u, int v, int w) {
	ver[++cnte] = v, wei[cnte] = w, nxt[cnte] = hd[u], hd[u] = cnte;
}
void dfs(int u) {
	a[col[u]]++;
	for (int i = hd[u]; i; i = nxt[i]) {
		int v = ver[i], w = wei[i];
		if (w == 1) a[3]++;
		if (col[v] == -1) {
			col[v] = (col[u] + w) % 3;
			dfs(v); 
		} else if (col[v] != (col[u] + w) % 3) {
			succ = 1;
		}
	}
}

int main() {
//	freopen("chain.in", "r", stdin);
//	freopen("chain.out", "w", stdout);  
	scanf("%d %d", &n, &m);
	for (int i = 1, u, v; i <= m; i++) {
		scanf("%d %d", &u, &v);
		adde(u, v, 1), adde(v, u, 2); 
	}
	memset(col, -1, sizeof(col));
	for (int i = 1; i <= n; i++) {
		if (col[i] == -1) {
			a[col[i] = 0] = a[1] = a[2] = a[3] = succ = 0;
			dfs(i);
			if (succ) {
				ll tmp = a[0] + a[1] + a[2];
			  ans += 1ll * tmp * tmp;
			  continue;
		  }   
		  if ((!a[0]) || (!a[1]) || (!a[2])) {
			  ans += a[3];
			  continue;
		  }
		  ans += 1ll * a[0] * a[1];
		  ans += 1ll * a[1] * a[2];
		  ans += 1ll * a[0] * a[2];
		}
	}
	printf("%lld\n", ans);
	return 0;  
}