m根号m算法
度数小向读书大连边
度数相同编号小向编号大
#include <bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
#define fi first
#define se second
#define pb push_back
#define inf 1<<62
#define endl "\n"
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define de_bug(x) cerr << #x << "=" << x << endl
#define all(a) a.begin(),a.end()
#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fer(i,a,b) for(int i=a;i<=b;i++)
#define der(i,a,b) for(int i=a;i>=b;i--)
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
int n, m , k;
pii e[N];
vi g[N];
int vis[N];
int d[N];
void solve() {
cin >> n >> m;
fer(i, 1, m) {
cin >> e[i].fi >> e[i].se;
d[e[i].fi]++;
d[e[i].se]++;
}
fer(i, 1, m) {
int a = e[i].fi;
int b = e[i].se;
if(d[a] < d[b]) g[a].push_back(b);
if(d[a] == d[b]) g[min(a, b)].push_back(max(a, b));
if(d[a] > d[b]) g[b].push_back(a);
}
int ans=0;
for(int i=1;i<=n;i++){
for(auto v:g[i]){
vis[v]=i;
}
for(auto v:g[i]){
for(auto x:g[v]){
if(vis[x]==i)ans++;
}
}
}
cout<<ans<<endl;
}
int main() {
IOS;
int _ = 1;
//cin>>_;
while( _-- )
solve();
}