#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int n, m, new_cost, old_cost;

#define MaxN 500001
#define ULL unsigned long long
#define INF 1LL << 62

vector<pair<int,ULL> >G[MaxN];
vector<ULL> d;
priority_queue<pair<int,ULL>, vector<pair<int,ULL> >, greater<pair<int, ULL> > >Q;

int main() {

    cin >> n >> m >> new_cost >> old_cost;

    d = vector<unsigned long long>(n + 1, INF);

    for ( int i = 1, x, y; i <= m; ++i) {
        cin >> x >> y;
        G[x].push_back({y,new_cost});
        G[y].push_back({x,new_cost});
    }

    Q.push({0, 1});
    d[1] = 0;

    while(Q.size()) {
        int dx = Q.top().first;
        int x  = Q.top().second;
        Q.pop();

        for ( const auto y : G[x] ) {
            int vx = y.first;
            int dvx = y.second;

            if ( d[vx] > d[x] + dvx ) {
                d[vx] = d[x] + dvx;
                Q.push({d[vx], vx});
            }
        }
    }

    (d[n] < old_cost) ? cout << d[n] : cout << old_cost;


    return 0;
}