#include <iostream>
#include <set>
#include <vector>
#include <deque>
#include <map>
#include <cmath>
#include <random>

#define se second
#define fi first
#define mp make_pair
#define pb push_back

typedef long long ll;
typedef long double ld;

using namespace std;

const int inf = (int)1e9;

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<pair<int, int>>> g(n);
    for (int i = 0; i < m; i++) {
        int x, y, W;
        cin >> x >> y >> W;
        x--, y--;
        g[x].push_back(make_pair(y, W));
        g[y].push_back(make_pair(x, W));
    }
    int start;
    cin >> start;
    start--;
    vector<int> w(n, inf);
    w[start] = 0;
    set<pair<int, int>> st;
    for (int i = 0; i < n; i++) {
        st.insert({w[i], i});
    }
    while (!st.empty()) {
        pair<int, int> cur_pair = *st.begin();
        st.erase(cur_pair);
        int cur_rst = cur_pair.first;
        int cur = cur_pair.second;
        for (auto e : g[cur]) {
            int nxt = e.first;
            int cur_nxt_w = e.second;
            if (w[nxt] > w[cur] + cur_nxt_w) {
                st.erase({w[nxt], nxt});
                w[nxt] = w[cur] + cur_nxt_w;
                st.insert({w[nxt], nxt});
            }
        }
    }
    for (auto e : w) cout << e << ' ';
    return 0;
}
