#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;}
