3 3
1 2
3 1
2 3
 2 0
 10 17
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
 2 1
1 2
 8 13
1 2
2 3
3 4
4 1
2 4
1 3
5 6
6 7
7 8
8 5
6 8
5 7
1 8
 3 2
1 2
2 3
 10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
 10 40
1 3
2 6
9 10
4 6
1 2
1 8
6 10
3 6
1 4
5 7
3 8
3 9
4 5
3 7
8 9
5 9
5 6
2 3
3 4
1 6
4 8
3 10
5 10
2 8
2 10
4 7
1 10
1 7
4 10
5 8
8 10
7 9
6 8
2 7
4 9
6 9
7 8
6 7
1 5
2 9
 10 9
1 2
2 3
3 1
4 5
5 6
6 7
7 4
4 6
5 7
 1000000 0
 8 11
1 2
1 3
1 4
2 3
2 7
7 4
4 2
7 5
8 1
1 7
7 8
 9 9
1 2
2 3
3 1
4 5
5 6
6 4
7 8
8 9
9 7
 15 14
1 2
1 3
1 4
1 5
2 6
2 7
7 8
7 9
3 10
10 11
4 12
12 13
13 14
13 15
 10 17
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
 9 12
1 2
2 3
3 1
1 4
4 5
5 1
1 6
6 7
7 1
1 8
8 9
9 1
 3 1
1 2
 10 5
5 7
4 8
9 10
7 10
6 10
 15 15
1 2
1 3
1 4
1 5
2 6
2 7
7 8
7 9
3 10
10 11
4 12
12 13
13 14
13 15
15 1
 4 3
1 2
2 3
3 1
 10 30
4 9
4 6
1 2
8 10
7 8
4 7
1 8
6 7
5 6
1 5
7 9
1 7
8 9
7 10
9 10
3 9
2 7
5 7
5 9
2 8
2 9
5 8
3 10
1 6
3 6
2 10
6 8
3 4
2 5
4 5
 4 3
1 2
1 3
1 4
 4 6
1 2
2 3
3 4
4 1
1 3
2 4
 10 9
1 2
1 3
1 4
2 5
5 6
2 7
3 8
3 9
9 10
 10 10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 1
 3 0
 6 6
1 2
2 3
3 1
4 5
5 6
6 4
 10 0
 9 15
1 2
2 3
3 1
1 4
4 5
5 1
1 6
6 7
7 1
1 8
8 9
9 1
2 9
7 4
2 8
 4 0
 1 0

1
 0
 43
 0
 8
 0
 84
 82
 63
 166666166667000000
 21
 30
 292
 64
 36
 0
 84
 284
 1
 37
 1
 4
 59
 50
 1
 2
 120
 28
 4
 0

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;

using namespace std;

#define endl '\n'
#define fast_io                       \
    ios_base::sync_with_stdio(false); \
    cin.tie(0);                       \
    cout.tie(0);

typedef long long int ll;
typedef long double ld;
#define forn(i, n) for (int i = 0; i < int(n); i++)

ll modExp(int a, int k, ll MOD)
{
    ll r = 1, t = a;
    while (k)
    {
        if (k & 1)
            r = r * t % MOD;
        t = t * t % MOD;
        k >>= 1;
    }
    return r;
}

ll modInverse(ll a, ll m)
{
    ll m0 = m;
    ll y = 0, x = 1;
    if (m == 1)
        return 0;
    while (a > 1)
    {
        ll q = a / m;
        ll t = m;
        m = a % m, a = t;
        t = y;
        y = x - q * y;
        x = t;
    }
    if (x < 0)
        x += m0;
    return x;
}

//use to find kth smallest element in int set, insert with ob.insert(int), find rank with *ob.find_by_order(k-1)
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;  

void print(ll ar[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << ar[i] << " ";
    }
    cout << endl;
}

void print(vector<ll> &vec)
{
    for (int i = 0; i < vec.size(); i++)    
    {
        cout << vec[i] << " ";
    }
    cout << endl;
}


void count_dfs(vector<vector<int>> & graph, int ind, bool visited[], int depth[], int & tri3)
{
    visited[ind] = true;

    for(auto i: graph[ind])
    {
        if(!visited[i])
        {
            depth[i] = depth[ind] + 1;
            count_dfs(graph, i, visited, depth, tri3);
        }
        else if(depth[i]== depth[ind]-2)
        {
            tri3++;
        }
    }

}

int main()
{
    fast_io
    
    int n,m;
    cin >> n>>m;

    vector<vector<int>> graph(n + 1);

    for (int i = 1; i <= m; i++)
    {
        int u, v;
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }

    int depth[n + 1];
    bool visited[n + 1];
    for (int i = 0; i <= n;i++)
    {
        depth[i] = -1;
        visited[i] = false;
    }

    int tri3 = 0;

    for (int i = 1; i <= n;i++)
    {
        if(!visited[i])
        {
            depth[i] = 0;
            count_dfs(graph, i, visited, depth, tri3);
        }
    }
    ll count_ticks = 0;
    for (int u = 1; u <= n; u++)
    {
        for( auto v : graph[u])
        {
            count_ticks += graph[u].size() + graph[v].size() - 2;
        }
    }

    count_ticks /= 4;

    ll tri2 = count_ticks - tri3;
    ll tri1 = (n - 2) * m - tri3 - 2 * tri2;
    ld ans = (ld)n * (ld)(n - 1) * (ld)(n - 2);
    ans /= (ld)6;
    ans -= (ld)(tri2 + tri1);
    // cout << tri3 << endl;
    // cout << count_ticks << endl;
    cout << (ll)ans << endl;
    
}
