#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 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 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=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; }