#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
using namespace std;
	//freopen("E:\\ipt.txt", "r", stdin);
#define INF 0x3f3f3f3f
#define LL long long
#define mxn 1000005
#define mxe 2500005

int cost[mxn], fst[mxn], nxt[mxe], from[mxn], to[mxe], sz;
int rt[mxn];
bool isrt[mxn];

int find(int x){
	if(rt[x]==x) return x;
	return rt[x]=find(rt[x]);
}

void insert(int x, int y){
	nxt[sz]=fst[x], to[sz]=y, fst[x]=sz++;
}

int N, a, b, M;
int dis[mxn], vis[mxn];
//int spfa(int st, int ed){
//	memset(dis, 0x3f, sizeof(dis));
//	queue<int> que;
//	dis[st]=0, que.push(st), vis[st]=1;
//	while(!que.empty()){
//		int u=que.front(); que.pop(); vis[u]=0;
//		for(int cur=fst[u]; cur!=-1; cur=nxt[cur]){
//			int v=to[cur];
//			if(dis[v]>dis[u]+1){
//				dis[v]=dis[u]+1;
//				if(!vis[v]) que.push(v), vis[v]=1;
//			}
//		}
//	}
//	return dis[ed];
//}

bool edge(int x, int y){
	for(int cur=fst[x]; cur!=-1; cur=nxt[cur])
		if(to[cur]==y) return 1;
	return 0;
}

struct node{
	int id, deep;
	node(){};
	node(int x, int y):id(x), deep(y){}
};

int bfs_(int st, int ed){
	memset(vis, 0, sizeof(vis));
	queue<node> que;
	que.push(node(st, 0)), vis[st]=1;
	while(!que.empty()){
		int u=que.front().id, d=que.front().deep;
		que.pop();
		for(int cur=fst[u]; cur!=-1; cur=nxt[cur]){
			int v=to[cur];
			if(!vis[v]){
				if(v==ed) return d+1;
				vis[v]=1;
				que.push(node(v, d+1));
			}
		}
	}
	return INF;
}

int bfs(int st, int ed){
	memset(vis, 0, sizeof(vis));
	queue<node> que;
	que.push(node(st, 0)), vis[st]=1;
	while(!que.empty()){
		int u=que.front().id, d=que.front().deep;
		que.pop();
		for(int i=1; i<=N; ++i)
			if(!vis[i] && !edge(u, i)){
				if(i==ed) return d+1;
				vis[i]=1;
				que.push(node(i, d+1));
			}
	}
	return INF;
}

set<pair<int, int>> st;
int main(){
	//freopen("E:\\ipt.txt", "r", stdin);
	while(cin>>N>>M>>a>>b){
		memset(fst, -1, sizeof(fst)), sz=0;
		for(int i=0; i<M; ++i){
			int x, y;
			scanf("%d%d", &x, &y);
			//st.insert(pair<int, int>(x, y));
			//st.insert(pair<int, int>(y, x));
			insert(x, y), insert(y, x);
		}
		LL A=bfs_(1, N);
		LL B=bfs(1, N);
		if(A!=INF) A*=a; else A*=INF;
		if(B!=INF) B*=b; else B*=INF;
		printf("%d\n", min(A, B));
	}
	return 0;
}