#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;

int main()
{
    int n,k,a,b; cin>>n>>k>>a>>b;

    int sol=0;

    vector<vector<int>> Adj(n+1);
    for(int i=0;i<k;++i){
        int x,y; cin>>x>>y;
        if((x==1&&y==n) || (x==n&&y==1)) sol=a;
        Adj[x].push_back(y);
        Adj[y].push_back(x);
    }

    if(sol==0) sol=b;

    if(sol!=a){
        vector<int> dst(n+1,-1);
        queue<int> q;
        q.push(1); dst[1]=0;

        bool cont=true;
        while(!q.empty()&&cont){
            int v=q.front(); q.pop();

            for(int i : Adj[v])
                if(dst[i]==-1){
                    dst[i]=dst[v]+1;
                    q.push(i);
                    if(i==n){ cont=false; break; }
            }
        }
        if(dst[n]!=-1 && a*dst[n]<sol) sol=a*dst[n];
    }
    else{
        //try to get there with as few b's as possible
        vector<int> dst(n+1,-1);
        queue<int> q;
        q.push(1); dst[1]=0;

        bool cont=true;
        while(!q.empty() && cont){
            int v=q.front(); q.pop();

            set<int> ngb(Adj[v].begin(),Adj[v].end());
            for(int i=1;i<=n;++i)
                if(dst[i]==-1 && ngb.find(i)==ngb.end()){
                    dst[i]=dst[v]+1;
                    q.push(i);
                    if(i==n){ cont=false; break; }
                }
        }
        if(dst[n]!=-1 && b*dst[n]<sol) sol=b*dst[n];
    }

    cout<<sol<<'\n';
}