#include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <assert.h>
using namespace std;
int N, M, graph[1001][1001];
int main() {
scanf("%d", &N);
scanf("%d", &M);
while (M--) {
int u, v;
scanf("%d %d", &u, &v);
graph[u][v] = graph[v][u] = 1;
}
long long diffColor = 0;
for (int i = 1; i <= N; i++) {
int blackCount = 0, redCount = 0;
for (int j = 1; j <= N; j++) {
if (i != j) {
blackCount += !graph[i][j];
redCount += graph[i][j];
}
}
diffColor += blackCount * redCount;
}
assert(diffColor % 2 == 0);
long long sameColor = (long long)N * (N - 1) * (N - 2) / 6 - diffColor / 2;
printf("%lld\n", sameColor);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8bWVtb3J5Lmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgTiwgTSwgZ3JhcGhbMTAwMV1bMTAwMV07CmludCBtYWluKCkgewoJc2NhbmYoIiVkIiwgJk4pOwoJc2NhbmYoIiVkIiwgJk0pOwoJd2hpbGUgKE0tLSkgewoJCWludCB1LCB2OwoJCXNjYW5mKCIlZCAlZCIsICZ1LCAmdik7CgkJZ3JhcGhbdV1bdl0gPSBncmFwaFt2XVt1XSA9IDE7Cgl9Cglsb25nIGxvbmcgZGlmZkNvbG9yID0gMDsKCWZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykgewoJCWludCBibGFja0NvdW50ID0gMCwgcmVkQ291bnQgPSAwOwoJCWZvciAoaW50IGogPSAxOyBqIDw9IE47IGorKykgewoJCQlpZiAoaSAhPSBqKSB7CgkJCQlibGFja0NvdW50ICs9ICFncmFwaFtpXVtqXTsKCQkJCXJlZENvdW50ICs9IGdyYXBoW2ldW2pdOwoJCQl9CgkJfQoJCWRpZmZDb2xvciArPSBibGFja0NvdW50ICogcmVkQ291bnQ7Cgl9Cglhc3NlcnQoZGlmZkNvbG9yICUgMiA9PSAwKTsKCWxvbmcgbG9uZyBzYW1lQ29sb3IgPSAobG9uZyBsb25nKU4gKiAoTiAtIDEpICogKE4gLSAyKSAvIDYgLSBkaWZmQ29sb3IgLyAyOwoJcHJpbnRmKCIlbGxkXG4iLCBzYW1lQ29sb3IpOwoJcmV0dXJuIDA7Cn0K