#include #include #include #define maxdim 500005 #define inf (1<<29) using namespace std; int n,m,A,B; int D[maxdim],D2[maxdim]; vectorG[maxdim]; set< pair >S; setV[maxdim]; inline void dijkstra () { for ( int i = 2 ; i <= n ; ++i ){ D[i] = inf; S.insert(make_pair(inf,i)); } S.insert(make_pair(0,1)); while ( !S.empty() ){ int nod = (*(S.begin())).second; S.erase(S.begin()); for ( vector::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){ int vecin = (*itt); if ( D[vecin] > D[nod]+A ){ S.erase(make_pair(D[vecin],vecin)); D[vecin] = D[nod]+A; S.insert(make_pair(D[nod]+A,vecin)); } } } } inline int getDirect ( int x , int y ){ for ( vector::iterator itt = G[x].begin() ; itt != G[x].end() ; ++itt ){ if ( (*itt) == y ){ return A; } } return B; } int viz[maxdim],L[maxdim],C[maxdim]; inline void bfs () { viz[1] = 1; for ( int i = 2 ; i <= n ; ++i ){ L[++L[0]] = i; } int p = 1,u = 0; C[++u] = 1; while ( p <= u ){ int nod = C[p]; for ( int i = 1 ; i <= L[0] ; ++i ){ if ( V[nod].find(L[i]) == V[nod].end() ){ viz[L[i]] = 1; D2[L[i]] = D2[nod]+1; swap(L[i],L[L[0]]); --L[0]; --i; } } ++p; } } int main () { // #ifndef ONLINE_JUDGE // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); // #endif scanf("%d %d %d %d",&n,&m,&A,&B); int x,y; for ( int i = 1 ; i <= m ; ++i ){ scanf("%d %d",&x,&y); G[x].push_back(y); G[y].push_back(x); V[x].insert(y); V[y].insert(x); } dijkstra(); int sol = D[n]; bfs(); sol = min(1LL*sol,1LL*D2[n]*B); printf("%d\n",sol); return 0; }