Problem: There are n players numbered from 0 to n-1 with ranks. The i-th player has rank i.

Players can form teams: the team should consist of three players and no pair of players in the team should have a conflict. The rank of the team is calculated using the following algorithm: let i, j, k be the ranks of players in the team and i < j < k, then the rank of the team is equal to A ⋅ i + B ⋅ j + C ⋅ k.

You are given information about the pairs of players who have a conflict. Calculate the total sum of ranks over all possible valid teams modulo 2^{64}.

Input

The first line contains two space-separated integers n and m (3 ≤ n ≤ 2 ⋅ 10^5, 0 ≤ m ≤ 2 ⋅ 10^5) — the number of players and the number of conflicting pairs.

The second line contains three space-separated integers A, B and C (1 ≤ A, B, C ≤ 10^6) — coefficients for team rank calculation.

Each of the next m lines contains two space-separated integers u_i and v_i (0 ≤ u_i, v_i < n, u_i ≠ v_i) — pair of conflicting players.

It's guaranteed that each unordered pair of players appears in the input file no more than once.

Output

Print single integer — the total sum of ranks over all possible teams modulo 2^{64}.

Examples

Input

4 0
2 3 4


Output

64


Input

4 1
2 3 4
1 0


Output

38


Input

6 4
1 5 3
0 3
3 5
5 4
4 3


Output

164

Note

In the first example all 4 teams are valid, i.e. triples: {0, 1, 2}, {0, 1, 3}, {0, 2, 3} {1, 2, 3}.

In the second example teams are following: {0, 2, 3}, {1, 2, 3}.

In the third example teams are following: {0, 1, 2}, {0, 1, 4}, {0, 1, 5}, {0, 2, 4}, {0, 2, 5}, {1, 2, 3}, {1, 2, 4}, {1, 2, 5}.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int n, m, cnt, deg[200005], vis[200005], rt[200005], ls[200005 * 50],
    rs[200005 * 50];
unsigned long long a, b, c, s1, s2, s3, s4, s5, u[200005], v[200005],
    ss[200005], tt[200005], num[200005], sum1[200005 * 50], sum2[200005 * 50];
vector<int> g[200005];
unsigned long long calc(unsigned long long x, unsigned long long y,
                        unsigned long long z) {
  if (x > y) swap(x, y);
  if (y > z) swap(y, z);
  if (x > y) swap(x, y);
  return a * x + b * y + c * z;
}
void calc1() {
  int i;
  for (i = n - 1; i >= 0; i--) ss[i] = ss[i + 1] + c * i;
  for (i = n - 2; i >= 0; i--) {
    tt[i] = tt[i + 1] + ss[i + 1] + b * i * (n - i - 1);
    num[i] = num[i + 1] + n - i - 1;
  }
  for (i = n - 3; i >= 0; i--) s1 += tt[i + 1] + a * i * num[i + 1];
}
void calc2() {
  int i;
  for (i = 1; i <= m; i++) {
    if (u[i] > v[i]) swap(u[i], v[i]);
    s2 += u[i] * (u[i] - 1) / 2 * a;
    s2 += (v[i] - u[i] - 1) * (u[i] + v[i]) / 2 * b;
    s2 += (v[i] + n) * (n - v[i] - 1) / 2 * c;
    s2 += u[i] * (b * u[i] + a * (n - u[i] - 2));
    s2 += v[i] * (c * (v[i] - 1) + b * (n - v[i] - 1));
  }
}
void update(int &x, int l, int r, int p) {
  if (!x) x = ++cnt;
  sum1[x] += p;
  sum2[x] += 1;
  if (l == r) return;
  int mid = (l + r) / 2;
  if (p <= mid)
    update(ls[x], l, mid, p);
  else
    update(rs[x], mid + 1, r, p);
}
unsigned long long query1(int x, int l, int r, int L, int R) {
  if (!x || L > R) return 0;
  if (l >= L && r <= R) return sum1[x];
  int mid = (l + r) / 2;
  unsigned long long ans = 0;
  if (L <= mid) ans += query1(ls[x], l, mid, L, R);
  if (R > mid) ans += query1(rs[x], mid + 1, r, L, R);
  return ans;
}
unsigned long long query2(int x, int l, int r, int L, int R) {
  if (!x || L > R) return 0;
  if (l >= L && r <= R) return sum2[x];
  int mid = (l + r) / 2;
  unsigned long long ans = 0;
  if (L <= mid) ans += query2(ls[x], l, mid, L, R);
  if (R > mid) ans += query2(rs[x], mid + 1, r, L, R);
  return ans;
}
unsigned long long q1(int x, int y, int l, int r) {
  return query1(rt[x], 0, n - 1, l, r) + query1(rt[y], 0, n - 1, l, r);
}
unsigned long long q2(int x, int y, int l, int r) {
  return query2(rt[x], 0, n - 1, l, r) + query2(rt[y], 0, n - 1, l, r);
}
void calc3() {
  unsigned long long pre;
  int i;
  for (i = 1; i <= m; i++) {
    update(rt[u[i]], 0, n - 1, v[i]);
    update(rt[v[i]], 0, n - 1, u[i]);
  }
  for (i = 1; i <= m; i++) {
    pre = s3;
    if (u[i] > v[i]) swap(u[i], v[i]);
    s3 += a * q1(u[i], v[i], 0, u[i] - 1);
    s3 += b * q1(u[i], v[i], u[i] + 1, v[i] - 1);
    s3 += c * q1(u[i], v[i], v[i] + 1, n - 1);
    s3 += u[i] * (b * q2(u[i], v[i], 0, u[i] - 1) +
                  a * q2(u[i], v[i], u[i] + 1, n - 1) - a);
    s3 += v[i] * (c * q2(u[i], v[i], 0, v[i] - 1) +
                  b * q2(u[i], v[i], v[i] + 1, n - 1) - c);
    if (pre > s3) s5++;
  }
}
void calc4() {
  int i, s, t, k;
  for (i = 1; i <= m; i++) {
    deg[u[i]]++;
    deg[v[i]]++;
  }
  for (i = 1; i <= m; i++) {
    s = u[i];
    t = v[i];
    if (deg[s] > deg[t] || (deg[s] == deg[t] && s > t)) swap(u[i], v[i]);
    g[u[i]].push_back(v[i]);
  }
  for (k = 1; k <= m; k++) {
    for (i = 0; i < g[u[k]].size(); i++) vis[g[u[k]][i]] = k;
    for (i = 0; i < g[v[k]].size(); i++)
      if (vis[g[v[k]][i]] == k) s4 += calc(u[k], v[k], g[v[k]][i]);
  }
}
int main() {
  int i;
  cin >> n >> m >> a >> b >> c;
  for (i = 1; i <= m; i++) cin >> u[i] >> v[i];
  calc1();
  calc2();
  calc3();
  calc4();
  for (i = 1; i <= 63; i++) s5 = s5 * 2;
  cout << s1 - s2 + (s3 / 2 + s5) - s4 << endl;
  return 0;
}