#include #include #include #include #include #include #include #include #include #include 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 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 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> 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(x, y)); //st.insert(pair(y, x)); insert(x, y), insert(y, x); } LL A=spfa(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; }