#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 5;
ll n, q, s, cnt, r1, r2, tot;
ll head[N], ver[N * 3], edge[N * 3], nxt[N * 3], d[N];
ll _left[N], _right[N];
bool vis[N];
void add(ll x, ll y, ll z) {
ver[++tot] = y, edge[tot] = z, nxt[tot] = head[x], head[x] = tot;
}
void update_in(ll p) {
add(p, _left[p], 0); add(p, _right[p], 0);
}
void update_out(ll p) {
add(_left[p], p, 0); add(_right[p], p, 0);
}
void build_in(ll &p, ll l, ll r) {
if (l == r) {
p = l;
return;
}
p = ++cnt;
ll mid = (l + r) / 2;
build_in(_left[p], l, mid);
build_in(_right[p], mid + 1, r);
update_in(p);
}
void build_out(ll &p, ll l, ll r) {
if (l == r) {
p = l;
return;
}
p = ++cnt;
ll mid = (l + r) / 2;
build_out(_left[p], l, mid);
build_out(_right[p], mid + 1, r);
update_out(p);
}
ll _l, _r, opt;
void change(ll p, ll l, ll r, ll u, ll w) {
if (_l <= l && _r >= r) {
if (opt == 2) add(u, p, w);
else add(p, u, w);
return;
}
ll mid = (l + r) / 2;
if (_l <= mid) change(_left[p], l, mid, u, w);
if (_r > mid) change(_right[p], mid + 1, r, u, w);
}
priority_queue <pair<ll, ll> > heap;
void dij() {
memset(d, 0x7f, sizeof(d));
memset(vis, 0, sizeof(vis));
d[s] = 0;
heap.push(make_pair(0, s));
while (!heap.empty()) {
ll x = heap.top().second; heap.pop();
if (vis[x]) continue;
vis[x] = 1;
for (ll i = head[x]; i; i = nxt[i]) {
ll y = ver[i], z = edge[i];
if (d[y] > d[x] + z) {
d[y] = d[x] + z;
heap.push(make_pair(-d[y], y));
}
}
}
}
signed main() {
scanf("%lld%lld%lld", &n, &q, &s);
cnt = n;
memset(head, -1, sizeof(head));
build_in(r1, 1, n);
build_out(r2, 1, n);
for (ll i = 1; i <= q; i++) {
scanf("%lld", &opt);
if (opt == 1) {
ll v, u, w;
scanf("%lld%lld%lld", &v, &u, &w);
add(v, u, w);
}
else {
ll v, w;
scanf("%lld%lld%lld%lld", &v, &_l, &_r, &w);
if (opt == 2) change(r1, 1, n, v, w);
else change(r2, 1, n, v, w);
}
}
dij();
for (ll i = 1; i <= n; i++) {
if (d[i] >= 0x7f7f7f7f) printf("-1 ");
else printf("%lld ", d[i]);
}
return 0;
}