#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10;

int n, m, E, cnt;
int fir[N], nex[N], arr[N], val[N], vis[N];
LL A, B, C, flag, col[N];

inline void Add_Edge(int x, int y, int w) {
	nex[++E] = fir[x];
	fir[x] = E; arr[E] = y; val[E] = w;
}

void dfs(int x) {
	vis[x] = 1;
	if (col[x] == 0) ++A;
	if (col[x] == 1) ++B;
	if (col[x] == 2) ++C;
	for (int i = fir[x]; i; i = nex[i]) {
		if (val[i] == 1) ++cnt;
		if (vis[arr[i]]) {
			if (col[arr[i]] != (col[x] + val[i]) % 3)
				flag = 1;
		}
		else {
			col[arr[i]] = (col[x] + val[i]) % 3;
			dfs(arr[i]);
		}
	}
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		int x, y;
		scanf("%d%d", &x, &y);
		Add_Edge(x, y, 1);
		Add_Edge(y, x, 2);
	}
	memset(col, 0xff, sizeof col);
	LL ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (vis[i]) continue;
		A = B = C = cnt = flag = 0;
		col[i] = 0;
		dfs(i);
		if (flag) ans += (A + B + C) * (A + B + C);
		else if (!A || !B || !C) ans += cnt;
		else ans += (A * B) + (B * C) + (A * C);
	}
	cout << ans << endl;
	return 0;
}
