#include <bits/stdc++.h>
using namespace std;
/*{{{*/  //template
#define rep(i,n) for(int i=0;i<(int)(n);i++)
constexpr int INF = numeric_limits<int>::max()/2;
constexpr long long LINF = numeric_limits<long long>::max()/3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr<<#x<<":"<<x<<endl
#define debug2(x,y) cerr<<#x<<","<<#y":"<<x<<","<<y<<endl
//struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double{ double d; explicit Double(double x) : d(x){} };
ostream& operator<<(ostream& os,const Double x){ os << fixed << setprecision(20) << x.d; return os; }
template<typename T> ostream& operator<<(ostream& os,const vector<T>& vec){ os << "["; for(const auto& v : vec){ os << v << ","; } os << "]"; return os; }
template<typename T,typename U> ostream& operator<<(ostream& os,const pair<T,U>& p){ os << "(" << p.first << ","<< p.second <<")"; return os; }
template<typename T> ostream& operator<<(ostream& os,const set<T>& st){ os<<"{"; for(T v:st) os<<v<<","; os <<"}"; return os; }
template<typename T,typename U> inline void chmax(T &x,U y){ if(y>x) x = y; }
template<typename T,typename U> inline void chmin(T &x,U y){ if(y<x) x = y; }
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a,ll b){ if(b==0) return a; else return gcd(b,a%b); }
//constexpr double eps = 1e-14; 
constexpr double eps = 1e-10; 
constexpr ll mod = 1e9+7;
const int dx[]={1,0,-1,0} ,dy[] = {0,1,0,-1};
/*}}}*/

constexpr long long inf = numeric_limits<long long>::max()/10;

struct edge{
    long long to,cost;
    edge(){}
    edge(long long to_,long long cost_) : to(to_),cost(cost_){}
};

vector<long long> dijkstra(int s,const vector<vector<edge>>& g){
    using P = pair<long long,long long>;
    long long V = g.size();
    vector<long long> d(V,inf);
    priority_queue<P,vector<P>,greater<P>> que;
    d[s] = 0;
    que.push(P(0,s));
    while(!que.empty()){
        P p=que.top();que.pop();
        long long v=p.second;
        if(d[v]<p.first) continue;
        for(int i=0;i<g[v].size();i++){
            edge e=g[v][i];
            if(d[e.to]>d[v]+e.cost){
                d[e.to]=d[v]+e.cost;
                que.push(P(d[e.to],e.to));
            }
        }
    }
    return d;
}

int main(){
    ll n,m,s,t;
    cin >> n >> m >> s >> t;
    s--;
    t--;
    vector<ll> u(m),v(m),a(m),b(m);
    for(int i=0;i<m;i++){
        cin >> u[i] >> v[i] >> a[i] >> b[i];
        u[i]--;
        v[i]--;
    }

    vector<vector<edge>> gyen(n);
    vector<vector<edge>> gsun(n);
    for(int i=0;i<m;i++){
        gyen[u[i]].emplace_back(edge(v[i],a[i]));
        gyen[v[i]].emplace_back(edge(u[i],a[i]));
        gsun[u[i]].emplace_back(edge(v[i],b[i]));
        gsun[v[i]].emplace_back(edge(u[i],b[i]));
    }

    auto yen = dijkstra(s,gyen);
    auto sun = dijkstra(t,gsun);

    //cout << "yen " << yen << endl;
    //cout << "sun " << sun<< endl;

    vector<pair<ll,ll>> c(n);
    for(int i=0;i<n;i++){   // iで両替
        ll cost = yen[i] + sun[i];
        c[i] = make_pair(cost,i+1);
    }
    //c.push_back(make_pair(yen[t],n+100));
    //cout << c << endl;
    sort(all(c));
    //cout << c << endl;


    int idx = 0;
    for(int i=0;i<n;i++){
        while(idx < c.size() and c[idx].second <= i){
            idx++;
        }
        //cerr << c[idx].first << endl;
        cout << 1000000000000000ll - c[idx].first << endl;
    }
}


Measured memory_bytes: 22908