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 <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define all(c) c.begin(),c.end()
#define pb push_back
#define fs first
#define sc second
#define show(x) cout << #x << " = " << x << endl
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
using namespace std;
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){return o<<"("<<p.fs<<","<<p.sc<<")";}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){o<<"sz = "<<vc.size()<<endl<<"[";for(const T& v:vc) o<<v<<",";o<<"]";return o;}
typedef long long ll;
int N,M;
const int MN=100000;
vector<int> G[MN],rG[MN];
bool vis[MN][3];
ll cnt[3];
ll use;
void dfs(int v,int c){
	if(vis[v][c]) return;
	vis[v][c]=1;
	cnt[c]++;
	for(int u:G[v]) dfs(u,(c+1)%3),use++;
	for(int u:rG[v]) dfs(u,(c+2)%3),use++;
}

int main(){
	cin>>N>>M;
	ll ans=0;
	rep(i,M){
		int x,y;
		cin>>x>>y;
		x--,y--;
		G[x].pb(y);
		rG[y].pb(x);
	}
	rep(v,N) if(!(vis[v][0]||vis[v][1]||vis[v][2])){
		rep(j,3) cnt[j]=0;
		use=0;
		dfs(v,0);
		if(vis[v][0]&&vis[v][1]&&vis[v][2]){
			ans+=cnt[0]*cnt[0];
		}else if(cnt[0]==0||cnt[1]==0||cnt[2]==0){
			ans+=use/2;
		}else{
			ans+=cnt[0]*cnt[1]+cnt[1]*cnt[2]+cnt[2]*cnt[0];
		}
	}
	cout<<ans<<endl;
}