#include<iostream>
#include<vector>
using namespace std;
class dsu{
public:
vector<int>par,sz;
int total_components;
void init (int n){
par.resize(n);
sz.resize(n);
//initially parent of all nodes are they themself
for(int i = 0;i < n; i++){
par[i] = i;
}
for(int i = 0;i < n; i++){
sz[i] = 1;
}
int total_components = n;
}
int get_superparent(int x){
//parent of all nodes are they themself
if(x == par[x]){
return x;
}
//path compression
return par[x] = get_superparent(par[x]);
}
//merging
void Union(int x, int y){
int superparent_x = get_superparent(x);
int superparent_y = get_superparent(y);
if(superparent_x != superparent_y){
par[superparent_x] = superparent_y;
sz[superparent_y]+=sz[superparent_x];
sz[superparent_x] = 0;
total_components--;
}
}
};
int main(){
dsu d;
int m_pairs, n_cities,ans;
cin>>n_cities>>m_pairs;
d.init(n_cities);
for(int i=0;i<m_pairs;i++){
int x,y;
cin>>x>>y;
d.Union(x,y);
}
for(int i=0;i<n_cities;i++){
int superparent_i = d.get_superparent(i);
ans+=(n_cities-d.sz[superparent_i]);
}
cout<<ans/2;
return 0;}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgZHN1ewpwdWJsaWM6CiAgICB2ZWN0b3I8aW50PnBhcixzejsKICAgIGludCB0b3RhbF9jb21wb25lbnRzOwogICAgdm9pZCBpbml0IChpbnQgbil7CiAgICAgICBwYXIucmVzaXplKG4pOwogICAgICAgc3oucmVzaXplKG4pOwogICAgICAgLy9pbml0aWFsbHkgcGFyZW50IG9mIGFsbCBub2RlcyBhcmUgdGhleSB0aGVtc2VsZgogICAgICAgZm9yKGludCBpID0gMDtpIDwgbjsgaSsrKXsKICAgICAgICBwYXJbaV0gPSBpOwogICAgICAgfQogICAgICAgZm9yKGludCBpID0gMDtpIDwgbjsgaSsrKXsKICAgICAgICBzeltpXSA9IDE7CiAgICAgICB9CiAgICAgICBpbnQgdG90YWxfY29tcG9uZW50cyA9IG47CiAgICB9CiAgICBpbnQgZ2V0X3N1cGVycGFyZW50KGludCB4KXsKICAgICAgICAvL3BhcmVudCBvZiBhbGwgbm9kZXMgYXJlIHRoZXkgdGhlbXNlbGYKICAgICAgICBpZih4ID09IHBhclt4XSl7CiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0KICAgICAgICAvL3BhdGggY29tcHJlc3Npb24KICAgICAgICByZXR1cm4gcGFyW3hdID0gZ2V0X3N1cGVycGFyZW50KHBhclt4XSk7CiAgICB9CiAgICAvL21lcmdpbmcKICAgIHZvaWQgVW5pb24oaW50IHgsIGludCB5KXsKICAgICAgICBpbnQgc3VwZXJwYXJlbnRfeCA9IGdldF9zdXBlcnBhcmVudCh4KTsKICAgICAgICBpbnQgc3VwZXJwYXJlbnRfeSA9IGdldF9zdXBlcnBhcmVudCh5KTsKICAgICAgICBpZihzdXBlcnBhcmVudF94ICE9IHN1cGVycGFyZW50X3kpewogICAgICAgICAgICBwYXJbc3VwZXJwYXJlbnRfeF0gPSBzdXBlcnBhcmVudF95OwogICAgICAgICAgICBzeltzdXBlcnBhcmVudF95XSs9c3pbc3VwZXJwYXJlbnRfeF07CiAgICAgICAgICAgIHN6W3N1cGVycGFyZW50X3hdID0gMDsKICAgICAgICAgICAgdG90YWxfY29tcG9uZW50cy0tOwogICAgICAgIH0KICAgIH0KfTsKaW50IG1haW4oKXsKICAgIGRzdSBkOwogICAgaW50IG1fcGFpcnMsIG5fY2l0aWVzLGFuczsKICAgIGNpbj4+bl9jaXRpZXM+Pm1fcGFpcnM7CiAgICBkLmluaXQobl9jaXRpZXMpOwogICAgZm9yKGludCBpPTA7aTxtX3BhaXJzO2krKyl7CiAgICAgICAgaW50IHgseTsKICAgICAgICBjaW4+Png+Pnk7CiAgICAgICAgZC5Vbmlvbih4LHkpOwogICAgfQogICAgZm9yKGludCBpPTA7aTxuX2NpdGllcztpKyspewogICAgICAgIGludCBzdXBlcnBhcmVudF9pID0gZC5nZXRfc3VwZXJwYXJlbnQoaSk7CiAgICAgICAgYW5zKz0obl9jaXRpZXMtZC5zeltzdXBlcnBhcmVudF9pXSk7CiAgICB9CiAgICBjb3V0PDxhbnMvMjsKcmV0dXJuIDA7fQo=