#include #include #include #define maxdim 500005 #define inf (1<<29) using namespace std; int n,m,A,B; int D[maxdim]; vectorG[maxdim]; set< pair >S; 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 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); } dijkstra(); printf("%d\n",min(D[n],getDirect(1,n))); return 0; }