#include <bits/stdc++.h>
using namespace std;
int n, m, s, t, num, head[2010], f[2010], ans;
int d1[2010], d2[2010], vis[2010][2010];
queue<int> q;
struct node {
  int v, pre;
} e[2010 * 2];
void Add(int from, int to) {
  num++;
  e[num].v = to;
  e[num].pre = head[from];
  head[from] = num;
}
void S1() {
  memset(d1, 127 / 3, sizeof(d1));
  memset(f, 0, sizeof(f));
  while (!q.empty()) q.pop();
  d1[s] = 0;
  f[s] = 1;
  q.push(s);
  while (!q.empty()) {
    int k = q.front();
    q.pop();
    for (int i = head[k]; i; i = e[i].pre) {
      int v = e[i].v;
      if (d1[v] > d1[k] + 1) {
        d1[v] = d1[k] + 1;
        if (f[v] == 0) {
          f[v] = 1;
          q.push(v);
        }
      }
    }
  }
}
void S2() {
  memset(d2, 127 / 3, sizeof(d2));
  memset(f, 0, sizeof(f));
  while (!q.empty()) q.pop();
  d2[t] = 0;
  f[t] = 1;
  q.push(t);
  while (!q.empty()) {
    int k = q.front();
    q.pop();
    for (int i = head[k]; i; i = e[i].pre) {
      int v = e[i].v;
      if (d2[v] > d2[k] + 1) {
        d2[v] = d2[k] + 1;
        if (f[v] == 0) {
          f[v] = 1;
          q.push(v);
        }
      }
    }
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &s, &t);
  int x, y;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    Add(x, y);
    Add(y, x);
    vis[x][y] = 1;
    vis[y][x] = 1;
  }
  S1();
  S2();
  int S = d1[t];
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      if (vis[i][j]) continue;
      if (d1[i] + d2[j] + 1 >= S && d2[i] + d1[j] + 1 >= S) ans++;
    }
  printf("%d\n", ans);
  return 0;
}
