#include #include #include #include #include #define DN 500005 using namespace std; typedef vector::iterator it; typedef set::iterator is; vector gr[DN]; int n,m,d[DN]; long long bc,a,b; queue c; void bfs() { d[1]=1; for(int i=2; i<=n; ++i) d[i]=0; for(c.push(1);!c.empty(); c.pop()) { int fr=c.front(); for(it i=gr[fr].begin(); i!=gr[fr].end(); ++i) if(!d[*i]) { d[*i]=d[fr]+1; c.push(*i); } } if(d[n]!=0) bc=min(bc,(d[n]-1)*a); } void tbfs() { set na; d[1]=1; for(int i=2; i<=n; ++i) { d[i]=0; na.insert(i); } for(c.push(1);c.size(); c.pop()) { int fr=c.front(); set nb; for(it i=gr[fr].begin(); i!=gr[fr].end(); ++i) if(d[*i]==0) nb.insert(*i); for(is i=na.begin(); i!=na.end();) if(d[*i]==0 && nb.find(*i)==nb.end()) { d[*i]=d[fr]+1; c.push(*i); is j=i; ++i; na.erase(j); }else { ++i; } } if(d[n]!=0) bc=min(bc,(d[n]-1)*b); } int main() { // freopen("input.txt","r",stdin); while(cin>>n>>m>>a>>b) { for(int i=1; i<=n; ++i)gr[i].clear(); int dir=b; for(;m--;) { int x,y; cin>>x>>y; if((x==1 && y==n) || (x==n && y==1)) dir=a; gr[x].push_back(y); gr[y].push_back(x); } bc=dir; bfs(); tbfs(); cout<