#include<bits/stdc++.h>
using namespace std;
/*------- Constants---- */

#define LL                      long long
#define Ulong                   unsigned long long
#define REP(i,n)                for(long long i=0; i < n ; i++ )
#define mp                      make_pair
#define pb                      push_back
#define all(x)                  (x).begin(),(x).end()
#define PI                      acos(-1.0)
#define EPS                     1e-14
#define F                       first
#define S                       second
#define di(x)                   int x; input(x)
#define in(x)                   input(x)
#define in2(x,y)                in(x),in(y)
#define in3(x,y,z)              in(x),in2(y,z)
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl
#define nl                      cout<<endl
#define ms(ara_name,value)      memset(ara_name,value,sizeof(ara_name))
#define IO                      ios_base::sync_with_stdio(0);cin.tie(0)
#define READ                    freopen("/home/matrixcode/Desktop/in.txt","r",stdin)
#define WRITE                   freopen("out.txt","w",stdout)
template<class T> inline void input(T &x) {
    char c = getchar();x = 0;
    int neg = 0;
    for(; ((c<48 || c>57) && c != '-'); c = getchar());
    if(c=='-'){neg = 1;c = getchar();}
    for(; c>47 && c<58 ; c = getchar()){x = (x<<1) + (x<<3) + c - 48;}
    if(neg) x = -x;
}
inline long long bigmod(long long p,long long e,long long M){
    long long ret = 1;
    for(; e > 0; e >>= 1){
        if(e & 1) ret = (ret * p) % M;
        p = (p * p) % M;
    } return ret;
}
template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
template <class T> inline T modinverse(T a,T M){return bigmod(a,M-2,M);}

/***************************** END OF TEMPLATE *******************************/


const int N = 2e5+5;
struct Edge{
    LL u,v,a,b;
};

vector<Edge>G[N];
LL dis[2][N];
LL Ans[N];
bool vis[N];
void dijkastra(int n,int source, LL d[], int f)
{
    for(int i = 1; i <= n ;i ++) d[i] = LONG_LONG_MAX;
    ms(vis,0);
    d[source] = 0;
    set<pair<LL,int> >pq;
    pq.insert({d[source], source});
    while(!pq.empty()){
        auto now = *pq.begin(); pq.erase(pq.begin());
        if(vis[now.S]) continue;
        d[now.S] = now.F;
        vis[now.S] = 1;
        for(auto e: G[now.S]) {
            LL w = (f ? e.a : e.b);
            if(d[e.v] > d[now.S] + w) {
                d[e.v] = d[now.S] + w;
                pq.insert({d[e.v] , e.v});
            }
        }
        
    }
}

int main()
{
    int n,m,s,t;
    cin>>n>>m>>s>>t;
    for(int i = 0; i < m; i ++ ) {
        LL u,v,a,b;
        cin>>u>>v>>a>>b;
        G[u].push_back({u,v,a,b});
        G[v].push_back({v,u,a,b});
    }
    
    dijkastra(n,s,dis[0],1);
    dijkastra(n,t,dis[1],0);
    
    //for(int i = 1;i <= n; i ++) printf("dis[%d] = %lld\n", i ,dis[0][i]);
    
    vector< pair<LL, LL > > vec;
    for(int i = 1; i<= n;i ++) {
        LL value = dis[0][i] + dis[1][i];
        vec.push_back({value, i});
    }
    sort(vec.begin(), vec.end());
    
    int ptr = 0;
    for(int i = 0; i < vec.size(); i ++) {
        LL node = vec[i].S;
        while(ptr < node ) Ans[ptr] = 1000000000000000LL - vec[i].F, ptr ++;
    }
    for(int i = 0; i < n; i ++) cout << Ans[i] << endl;
    
    
}


Measured memory_bytes: 20928