Problem: We have a grid with N rows and N columns. The cell at the i-th row and j-th column is denoted (i, j).

Initially, M of the cells are painted black, and all other cells are white. Specifically, the cells (a_1, b_1), (a_2, b_2), ..., (a_M, b_M) are painted black.

Snuke will try to paint as many white cells black as possible, according to the following rule:

* If two cells (x, y) and (y, z) are both black and a cell (z, x) is white for integers 1≤x,y,z≤N, paint the cell (z, x) black.



Find the number of black cells when no more white cells can be painted black.

Constraints

* 1≤N≤10^5
* 1≤M≤10^5
* 1≤a_i,b_i≤N
* All pairs (a_i, b_i) are distinct.

Input

The input is given from Standard Input in the following format:


N M
a_1 b_1
a_2 b_2
:
a_M b_M


Output

Print the number of black cells when no more white cells can be painted black.

Examples

Input

3 2
1 2
2 3


Output

3


Input

2 2
1 1
1 2


Output

4


Input

4 3
1 2
1 3
4 4


Output

3

Solution (in CPP):

Solution:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct edges
{
	int to,next,v;
}edge[202020];
int first[101010],now;
void adde(int x,int y,int z)
{
	now++;
	edge[now].to=y;
	edge[now].next=first[x];
	edge[now].v=z;
	first[x]=now;
}
bool vis[101010];
int c[101010];
int ap[3];
int cnt=0,cnt1=0;
bool work(int p)
{
	bool ret=true;
	vis[p]=true;
	ap[c[p]]++;
	cnt1++;
	for(int e=first[p];e;e=edge[e].next)
	{
		cnt++;
		if(!vis[edge[e].to])
		{
			c[edge[e].to]=(c[p]+edge[e].v)%3;
			if(!work(edge[e].to))
				ret=false;
		}
		else if(c[edge[e].to]!=(c[p]+edge[e].v)%3)
			ret=false;
	}
	return ret;
}
int main()
{
	int n,m,x,y;
	long long ans=0;
	scanf("%d%d",&n,&m);
	memset(first,0,sizeof(first));
	now=0;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		adde(x,y,1);
		adde(y,x,2);
	}
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
		if(!vis[i])
		{
			c[i]=0;
			cnt=0;
			cnt1=0;
			memset(ap,0,sizeof(ap));
			if(!work(i))
				ans+=(long long)cnt1*cnt1;
			else if(ap[1]&&ap[2])
				ans+=(long long)ap[0]*ap[1]+(long long)ap[1]*ap[2]+(long long)ap[2]*ap[0];
			else
				ans+=(cnt>>1);
		}
	printf("%lld",ans);
	return 0;
}