100 10
87 73
15 71
14 33
1 4
20 80
65 67
36 36
25 4
22 21
7 97
 4 2
3 3
3 4
 5 4
3 3
4 4
5 5
1 2
 4 4
1 2
2 3
3 1
4 4
 4 3
1 1
2 3
3 4
 1000000 1
255765 255765
 4 3
1 2
2 3
4 4
 4 2
1 1
1 2
 3 3
1 1
2 2
3 3
 5 4
1 1
2 3
2 4
2 5
 4 5
1 4
3 4
1 2
2 3
2 4
 4 4
2 3
2 4
3 4
4 4
 10 9
8 10
3 10
2 8
9 3
4 8
1 10
7 9
5 4
7 3
 10 10
1 2
2 3
3 4
4 5
5 1
6 6
7 7
8 8
9 9
10 10
 5 5
1 4
3 4
1 2
2 3
2 4
 3 3
1 2
2 2
3 3
 5 3
1 1
2 2
3 3
 6 12
1 2
1 3
2 3
1 1
2 2
3 3
4 5
5 6
4 6
4 4
5 5
6 6
 4 4
1 2
2 3
1 3
4 4
 5 4
1 2
3 3
4 4
5 5
 7 13
6 7
2 7
3 7
4 3
5 2
1 4
7 7
3 1
5 5
3 3
1 5
2 6
6 6
 2 2
1 1
2 2
 5 5
1 1
2 2
3 3
4 4
5 5
 1 1
1 1
 7 3
1 1
3 3
6 6
 3 3
1 1
2 3
3 3

0 1 0 0 0 0 0 1 0 0 8 6 12 0 8 0 0 0 0 0 57 0 0 0 0 0
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v) {
  for (int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
  }
  cout << "\n";
}
void print_arr(int v[], int size) {
  for (int i = 0; i < size; i++) {
    cout << v[i] << " ";
  }
  cout << "\n";
}
long long getSets(long long current, vector<long long> &disjointSets) {
  if (disjointSets[current] == current) {
    return current;
  } else {
    long long setNum = getSets(disjointSets[current], disjointSets);
    disjointSets[current] = setNum;
    return setNum;
  }
}
int main() {
  long long n = 0, m = 0;
  long long s = 0, t = 0, w = 0;
  long long selfEdgeCounter = 0;
  long long connectEdgeCounter = 0;
  cin >> n >> m;
  vector<long long> disjointSets(n, 0);
  for (long long i = 0; i < n; i++) {
    disjointSets[i] = i;
  }
  vector<long long> degree(n, 0);
  for (long long i = 0; i < m; i++) {
    scanf("%d%d", &s, &t);
    s--;
    t--;
    if (s == t) {
      selfEdgeCounter++;
    } else {
      disjointSets[getSets(s, disjointSets)] = getSets(t, disjointSets);
      connectEdgeCounter++;
      degree[s]++;
      degree[t]++;
    }
  }
  long long setsNum = getSets(0, disjointSets);
  for (long long i = 1; i < n; i++) {
    if (getSets(i, disjointSets) != setsNum) {
      cout << 0;
      return 0;
    }
  }
  long long possible1 = (selfEdgeCounter * (selfEdgeCounter - 1)) / 2;
  long long possible2 = selfEdgeCounter * connectEdgeCounter;
  long long possible3 = 0;
  for (long long i = 0; i < n; i++) {
    if (degree[i] >= 2) {
      possible3 += degree[i] * (degree[i] - 1) / 2;
    }
  }
  cout << possible1 + possible2 + possible3;
  return 0;
}
