#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef map<int,bool> MIB;
typedef set<int> SI;
int n, m;
LL  a, b;
set<int> novis,vis;
deque<int> q;
const int MAXN = 155555;
MIB edge[MAXN];
bool flag[MAXN];
LL d[MAXN];
bool check(map<int,bool> &Map,int x)
{
	return Map.count(x);
}
void bfs1()
{
	memset(d,0x7f,sizeof d);
	memset(flag,0,sizeof flag);
	q.clear();
	q.push_front(1);
	d[1] = 0;
	flag[1] = true;
	while (!q.empty())
	{
		int u = q.front(); q.pop_front();
		//cout<<u<<endl;
		for (MIB::iterator x = edge[u].begin();x!=edge[u].end();x++)
		{
			//cout<<"!!"<<x.first<<endl;
			if (flag[x->first]==false)
			{
				d[x->first] = d[u] + a;
				flag[x->first] = true;
				q.push_back(x->first);
			}
		}
	}
}
void bfs2()
{
	memset(d,0x7f,sizeof d);
	vector<int> tmp;
	novis.clear();
	q.clear();
	q.push_front(1);
	d[1] = 0;
	for (int i = 2; i <= n; ++ i) novis.insert(i);
	while(!q.empty()) 
	{
		//cout<<"q: "<<q.front()<<endl;
		int u = q.front(); q.pop_front();
		tmp.clear();
		for (SI::iterator x = novis.begin();x!=novis.end();x++)
		{
			if (check(edge[u],*x)==false) 
			{
				tmp.push_back(*x);
				d[*x] = d[u] + b;
				q.push_back(*x);
			} 
		}
		for (int i=0;i<tmp.size();i++) 
			novis.erase(tmp[i]);
	}
}
int main()
{
	freopen("I.in","r",stdin);
	while(scanf("%d %d %lld %lld", &n, &m, &a, &b) != EOF) {
		for (int i=1;i<=n;i++) edge[i].clear();
		for (int i = 1;  i <= m; ++ i) {
			int x, y;
			scanf("%d %d", &x, &y);
			//cout<<x<<' '<<y<<endl;
			edge[x][y] = true;
			edge[y][x] = true;
		}
		//for (int i=1;i<=n;i++){cout<<"edge "<<i<<": ";for (auto x:edge[i]) cout<<x.
		if (a < b) {
			if (check(edge[1],n)) {
				printf("%lld\n", a);
			}
			else {
				bfs1();
				//cout<<"dn:"<<d[n]<<endl;
				printf("%lld\n",min(d[n],b));
			}

		} else if (b < a) {
			if (check(edge[1],n)==false) {
				printf("%lld\n", b);
			}
			else 
			{
				bfs2();
				printf("%lld\n",min(a,d[n]));	
			}
		} else {
			printf("%lld\n", a);
		}
	}
}
