// Readiz lesson: complete local C++17 example.
#include <algorithm>
#include <deque>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
struct Edge {
    int to;
    int cost; // 0 or 1
};

vector<int> zeroOneBfs(const vector<vector<Edge>>& graph, int start) {
    const int INF = 1e9;
    int n = (int)graph.size();
    vector<int> dist(n, INF);
    deque<int> dq;

    dist[start] = 0;
    dq.push_back(start);

    while (!dq.empty()) {
        int u = dq.front();
        dq.pop_front();

        for (const Edge& e : graph[u]) {
            int nd = dist[u] + e.cost;
            if (nd >= dist[e.to]) continue;
            dist[e.to] = nd;
            if (e.cost == 0) dq.push_front(e.to);
            else dq.push_back(e.to);
        }
    }

    return dist;
}

int main() {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int n, m, start;
    if (!(cin >> n >> m >> start) || n < 1 || n > 200000 || m < 0 || m > 400000 || start < 0 || start >= n) return 1;
    vector<vector<Edge>> graph(n);
    for (int i = 0; i < m; ++i) {
        int u, v, w;
        if (!(cin >> u >> v >> w) || u < 0 || u >= n || v < 0 || v >= n || (w != 0 && w != 1)) return 1;
        graph[u].push_back({v, w});
    }
    auto dist = zeroOneBfs(graph, start);
    for (int i = 0; i < n; ++i) cout << (i ? " " : "") << (dist[i] == 1000000000 ? -1 : dist[i]);
    cout << '\n';
    return 0;
}
