#include <bits/stdc++.h>
using namespace std;
const int INF = (int)1E9;
const long long LINF = (long long)1E18;
const long double PI = acos(-1.0);
const long double EPS = 1E-12;
template <typename T>
T gcd(T a, T b) {
  return (b == 0) ? abs(a) : gcd(b, a % b);
}
template <typename T>
inline T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <typename T>
inline T mod(T a, T b) {
  a %= b;
  if (a < 0) a += b;
  return a;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
template <typename T>
inline T gmax(T a, T b) {
  return (a > b ? a : b);
}
template <typename T>
inline T gmin(T a, T b) {
  return (a < b ? a : b);
}
template <typename T>
inline string toString(T x) {
  ostringstream oss;
  oss << x;
  return oss.str();
}
inline long long toInt(const string& st) {
  istringstream iss(st);
  long long x;
  iss >> x;
  return x;
}
inline long double toDouble(const string& st) {
  istringstream iss(st);
  long double x;
  iss >> x;
  return x;
}
inline string toLower(string st) {
  for (int i = 0; i < (((int)(st).size())); i++) st[i] = tolower(st[i]);
  return st;
}
inline string toUpper(string st) {
  for (int i = 0; i < (((int)(st).size())); i++) st[i] = toupper(st[i]);
  return st;
}
inline long long mul(long long b, long long e, long long n) {
  long long ret;
  while (e) {
    if (e & 1) ret = (ret + b) % n;
    e >>= 1;
    b = (b + b) % n;
  }
  return ret;
}
inline long long pow(long long b, long long e, long long n) {
  long long ret = 1;
  while (e) {
    if (e & 1) ret = mul(ret, b, n);
    e >>= 1;
    b = mul(b, b, n);
  }
  return ret;
}
int n, m;
int deg[1000100];
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < (m); i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    deg[x]++;
    deg[y]++;
  }
  long long tmp = 0;
  for (int i = (1); i <= (n); i++) tmp += (n - 1ll - deg[i]) * deg[i];
  tmp /= 2;
  tmp = n * (n - 1ll) * (n - 2ll) / 6 - tmp;
  printf("%I64d\n", tmp);
  return 0;
}

### Prompt

Please formulate a Cpp solution to the following problem:

Alice and Bob don't play games anymore. Now they study properties of all sorts of graphs together. Alice invented the following task: she takes a complete undirected graph with n vertices, chooses some m edges and keeps them. Bob gets the <image> remaining edges.

Alice and Bob are fond of "triangles" in graphs, that is, cycles of length 3. That's why they wonder: what total number of triangles is there in the two graphs formed by Alice and Bob's edges, correspondingly?

Input

The first line contains two space-separated integers n and m (1 ≤ n ≤ 106, 0 ≤ m ≤ 106) — the number of vertices in the initial complete graph and the number of edges in Alice's graph, correspondingly. Then m lines follow: the i-th line contains two space-separated integers ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi), — the numbers of the two vertices connected by the i-th edge in Alice's graph. It is guaranteed that Alice's graph contains no multiple edges and self-loops. It is guaranteed that the initial complete graph also contains no multiple edges and self-loops.

Consider the graph vertices to be indexed in some way from 1 to n.

Output

Print a single number — the total number of cycles of length 3 in Alice and Bob's graphs together.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is advised to use the cin, cout streams or the %I64d specifier.

Examples

Input

5 5
1 2
1 3
2 3
2 4
3 4


Output

3


Input

5 3
1 2
2 3
1 3


Output

4

Note

In the first sample Alice has 2 triangles: (1, 2, 3) and (2, 3, 4). Bob's graph has only 1 triangle : (1, 4, 5). That's why the two graphs in total contain 3 triangles.

In the second sample Alice's graph has only one triangle: (1, 2, 3). Bob's graph has three triangles: (1, 4, 5), (2, 4, 5) and (3, 4, 5). In this case the answer to the problem is 4.

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const int INF = (int)1E9;
const long long LINF = (long long)1E18;
const long double PI = acos(-1.0);
const long double EPS = 1E-12;
template <typename T>
T gcd(T a, T b) {
  return (b == 0) ? abs(a) : gcd(b, a % b);
}
template <typename T>
inline T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <typename T>
inline T mod(T a, T b) {
  a %= b;
  if (a < 0) a += b;
  return a;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
template <typename T>
inline T gmax(T a, T b) {
  return (a > b ? a : b);
}
template <typename T>
inline T gmin(T a, T b) {
  return (a < b ? a : b);
}
template <typename T>
inline string toString(T x) {
  ostringstream oss;
  oss << x;
  return oss.str();
}
inline long long toInt(const string& st) {
  istringstream iss(st);
  long long x;
  iss >> x;
  return x;
}
inline long double toDouble(const string& st) {
  istringstream iss(st);
  long double x;
  iss >> x;
  return x;
}
inline string toLower(string st) {
  for (int i = 0; i < (((int)(st).size())); i++) st[i] = tolower(st[i]);
  return st;
}
inline string toUpper(string st) {
  for (int i = 0; i < (((int)(st).size())); i++) st[i] = toupper(st[i]);
  return st;
}
inline long long mul(long long b, long long e, long long n) {
  long long ret;
  while (e) {
    if (e & 1) ret = (ret + b) % n;
    e >>= 1;
    b = (b + b) % n;
  }
  return ret;
}
inline long long pow(long long b, long long e, long long n) {
  long long ret = 1;
  while (e) {
    if (e & 1) ret = mul(ret, b, n);
    e >>= 1;
    b = mul(b, b, n);
  }
  return ret;
}
int n, m;
int deg[1000100];
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < (m); i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    deg[x]++;
    deg[y]++;
  }
  long long tmp = 0;
  for (int i = (1); i <= (n); i++) tmp += (n - 1ll - deg[i]) * deg[i];
  tmp /= 2;
  tmp = n * (n - 1ll) * (n - 2ll) / 6 - tmp;
  printf("%I64d\n", tmp);
  return 0;
}

```