// Original C++ solution (slower):
#include<cstdio>

#include<cstring>

#include<vector>

#include<queue>

#include<map>

#include<set>



#define fst first

#define snd second



using namespace std;



typedef pair<int,int> pp;

set<int> G[105000];

//set<pp> res;

int dis[105000];

int S[105000];



int main(void) {

    int n,m,s,t;

    scanf("%d%d%d%d",&n,&m,&s,&t);

    s--, t--;

    memset(dis, 0x20, sizeof(dis));

    for(int i=0; i<m; i++) {

        int x,y;

        scanf("%d%d",&x,&y);

        x--, y--;

        G[x].insert(y);

        G[y].insert(x);

    }



    {

        priority_queue<pp> q;

        q.push(pp(-0, s));



        while(!q.empty()) {

            pp t = q.top(); q.pop();

            int d = -t.fst, x = t.snd;



            if(dis[x] != 0x20202020) continue;

            dis[x] = d;

            S[d]++;



            for(int y : G[x])

                if(dis[y] == 0x20202020)

                    q.push(pp(-(d+1), y));

        }

    }



    int old = dis[t];

    memset(dis, 0x20, sizeof(dis));



    long long int res=0;

    {

        priority_queue<pp> q;

        q.push(pp(-0, t));



        while(!q.empty()) {

            pp t = q.top(); q.pop();

            int d = -t.fst, x = t.snd;



            if(dis[x] != 0x20202020) continue;

            dis[x] = d;



            if(old-2-d >= 0)

                res += S[old-2-d];



            for(int y : G[x])

                if(dis[y] == 0x20202020)

                    q.push(pp(-(d+1), y));

        }

    }



    printf("%lld\n", res);

    return 0;



}

// Optimized solution to the same problem (faster):
#include<cstdio>

#include<cstring>

#include<vector>

#include<queue>

#include<map>

#include<set>



#define fst first

#define snd second



using namespace std;



typedef pair<int,int> pp;

vector<int> G[105000];

int dis[105000];

int S[105000];



int main(void) {

    int n,m,s,t;

    scanf("%d%d%d%d",&n,&m,&s,&t);

    s--, t--;

    memset(dis, 0x20, sizeof(dis));

    for(int i=0; i<m; i++) {

        int x,y;

        scanf("%d%d",&x,&y);

        x--, y--;

        G[x].push_back(y);

        G[y].push_back(x);

    }



    {

        priority_queue<pp> q;

        q.push(pp(-0, s));



        while(!q.empty()) {

            pp t = q.top(); q.pop();

            int d = -t.fst, x = t.snd;



            if(dis[x] != 0x20202020) continue;

            dis[x] = d;

            S[d]++;



            for(int y : G[x])

                if(dis[y] == 0x20202020)

                    q.push(pp(-(d+1), y));

        }

    }



    int old = dis[t];

    memset(dis, 0x20, sizeof(dis));



    long long int res=0;

    {

        priority_queue<pp> q;

        q.push(pp(-0, t));



        while(!q.empty()) {

            pp t = q.top(); q.pop();

            int d = -t.fst, x = t.snd;



            if(dis[x] != 0x20202020) continue;

            dis[x] = d;



            if(old-2-d >= 0)

                res += S[old-2-d];



            for(int y : G[x])

                if(dis[y] == 0x20202020)

                    q.push(pp(-(d+1), y));

        }

    }



    printf("%lld\n", res);

    return 0;



}

// Fastest known solution for this problem: