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>
using namespace std;
const double PI = acos(-1.0);
const long long INF = 1e9 + 47;
const long long LINF = INF * INF;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 1 << 21;
int n, m;
vector<int> g[N];
int d[N];
char u[N];
long long typ[5];
int cnt[N];
struct edge {
  int to;
  int id;
};
edge e[N];
int par_edge[N];
void dfs1(int v, int p) {
  u[v] = 1;
  for (auto j : g[v]) {
    edge i = e[j];
    if (i.to != p) {
      if (!u[i.to]) {
        d[i.to] = d[v] + 1;
        par_edge[i.to] = i.id;
        dfs1(i.to, v);
      } else {
        if (d[i.to] == d[v] - 2) {
          cnt[i.id >> 1]++;
          cnt[par_edge[v] >> 1]++;
          cnt[par_edge[p] >> 1]++;
          typ[1]++;
        }
      }
    }
  }
}
long long get(int x) { return x * (long long)(x - 1) / 2; }
int main() {
  scanf("%d %d", &n, &m);
  int now = 0;
  for (int i = (0); i < (m); ++i) {
    int u1, v;
    scanf("%d %d", &u1, &v);
    e[now++] = {v, i * 2};
    e[now++] = {u1, i * 2 + 1};
    g[u1].push_back(i * 2);
    g[v].push_back(i * 2 + 1);
  }
  assert(clock() / (double)CLOCKS_PER_SEC <= 1.0);
  memset(u, 0, sizeof(u));
  for (int i = (1); i < (n + 1); ++i) typ[2] += get((int)((g[i]).size()));
  typ[2] -= 3 * typ[1];
  for (int i = (0); i < (m); ++i) {
    int x = e[i * 2].to, y = e[i * 2 + 1].to;
    int tut =
        n - 2 - ((int)((g[x]).size()) - 1 + (int)((g[y]).size()) - 1) + cnt[i];
    typ[3] += tut;
  }
  cout << "typ[1]"
       << " = " << typ[1] << endl;
  ;
  typ[4] = n * (long long)(n - 1) * (n - 2) / 6 - typ[1] - typ[2] - typ[3];
  cout << typ[1] + typ[4] << endl;
  cerr << "Time elapsed: " << clock() / (double)CLOCKS_PER_SEC << endl;
  return 0;
}
