#include<stdio.h>
#include<set>
#include<vector>

#define maxdim 500005
#define inf (1<<29)

using namespace std;

int n,m,A,B;
int D[maxdim];
vector<int>G[maxdim];
set< pair<int,int> >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<int>::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<int>::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();
	
	int sol = D[n];
	for ( int i = 1 ; i <= n ; ++i ){
		sol = min(sol,D[i]+getDirect(i,n));
	}
	printf("%d\n",sol);
	
	return 0;
}