#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],D2[maxdim];
vector<int>G[maxdim];
set< pair<int,int> >S;
set<int>V[maxdim];
int C[maxdim];

inline void dijkstra () {
	
	int p = 1,u = 0;
	C[++u] = 1;
	for ( int i = 2 ; i <= n ; ++i ){
		D[i] = inf;
	}
	
	while ( p <= u ){
		int nod = C[p];
		
		for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
			int vecin = (*itt);
			
			if ( D[vecin] == inf && vecin != 1 ){
				D[vecin] = D[nod]+1;
				C[++u] = vecin;
			}
		}
		
		++p;
	}
}

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 viz[maxdim],L[maxdim];

inline void bfs () {
	
	viz[1] = 1;
	for ( int i = 2 ; i <= n ; ++i ){
		L[++L[0]] = i;
		D2[i] = inf;
	}
	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; C[++u] = L[i];
				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 = min(1LL*inf,1LL*A*D[n]);
	
	bfs();
	sol = min(1LL*sol,1LL*D2[n]*B);
	
	printf("%d\n",sol);
	
	return 0;
}