#include <bits/stdc++.h>


using namespace std;
#define rep(i,n) for (int i = 0; i < (int)(n); ++i)
#define reps(i,n) for (int i = 1; i <= (int)(n); ++i)
#define repd(i,n) for (int i = (int)(n - 1); i >= 0; --i)
#define repds(i,n) for (int i = (int)(n); i > 0; --i)
#define loop(i,x,n) for (int i = (int)(x); i < (n); ++i)
#define loops(i,x,n) for (int i = (int)(x); i <= (n); ++i)
#define loopd(i,x,n) for (int i = (int)(x); i > (n); --i)
#define loopds(i,x,n) for (int i = (int)(x); i >= (n); --i)
#define itrep(i,s) for (auto i = begin(s); i != end(s); ++i)
#define itrepd(i,s) for (auto i = rbegin(s); i != rend(s); ++i)
#define all(f,x,...) [&](decltype(x)& whole) { return (f)(begin(whole), end(whole), ##__VA_ARGS__); }(x)
#define rall(f,x,...) [&](decltype(x)& whole) { return (f)(rbegin(whole), rend(whole), ##__VA_ARGS__); }(x)
using ll = long long;
using ld = long double;
constexpr ll inf = static_cast<ll>(1e17);
constexpr int iinf = static_cast<int>(1e9);
constexpr double dinf = 1e10;
constexpr ld ldinf = 1e17;
ll mod = static_cast<ll>(1e9 + 7);
std::ostream& endn(std::ostream& os) { return os.put(os.widen('\n')); }
template<class T> constexpr int sz(const T& a) { return (int)a.size(); }
template<class T> constexpr T pow2(const T a) { return a * a; }
template<class T, class ... Args> constexpr T mins(T& a, Args... args) { return a = min<T>({ a, args... }); }
template<class T, class... Args> constexpr T maxs(T& a, Args... args) { return a = max<T>({ a,args... }); }
template<typename A, size_t N, typename T>
void fillArray(A(&array)[N], const T& val) { std::fill((T*)array, (T*)(array + N), val); }

int n, m, s, t;
vector<pair<int, ll>> g1[100005], g2[100005];
ll d1[100005], d2[100005];
void solve() {
    cin >> n >> m >> s >> t; --s; --t;
    rep(i, m) {
        int u, v; ll a, b;
        cin >> u >> v >> a >> b; --u; --v;
        g1[u].emplace_back(v, a); g1[v].emplace_back(u, a);
        g2[u].emplace_back(v, b); g2[v].emplace_back(u, b);
    }

    fillArray(d1, inf);
    fillArray(d2, inf);

    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> que;
    que.emplace(0, s);
    d1[s] = 0;
    while (!que.empty()) {
        auto p = que.top(); que.pop();

        rep(i, g1[p.second].size()) {
            auto v = g1[p.second][i];
            if (p.first + v.second < d1[v.first]) {
                d1[v.first] = p.first + v.second;
                que.emplace(d1[v.first], v.first);
            }
        }
    }

    que.emplace(0, t);
    d2[t] = 0;
    while (!que.empty()) {
        auto p = que.top(); que.pop();

        rep(i, g2[p.second].size()) {
            auto v = g2[p.second][i];
            if (p.first + v.second < d2[v.first]) {
                d2[v.first] = p.first + v.second;
                que.emplace(d2[v.first], v.first);
            }
        }
    }

    set<pair<ll, int>> s;
    rep(i, n) s.emplace(d1[i] + d2[i], i);

    rep(i, n) {
        cout << ll(1e15) - s.begin()->first << endn;
        s.erase({ d1[i] + d2[i],i });
    }

}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(15);
    solve();
    cout << flush;
    return 0;
}


Measured memory_bytes: 24952