#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 100, inf = 0x3f3f3f3f3f3f3f3f;
int n, q, s, cnt = 1;
int head[N], vis[N];
long long dis[N];
struct edge {
  int v, next;
  long long w;
} e[N << 2];
struct tree {
  int l, r;
} tr[N];
struct node {
  int u;
  long long d;
  bool operator<(const node &rhs) const { return d > rhs.d; }
};
priority_queue<node> que;
void add(int u, int v, long long w) {
  e[cnt].v = v;
  e[cnt].w = w;
  e[cnt].next = head[u];
  head[u] = cnt++;
}
void build(int p, int l, int r) {
  tr[p].l = l;
  tr[p].r = r;
  if (l == r) {
    add(p, l + 8 * n, 0);
    add(l + 8 * n, p, 0);
    add(p + 4 * n, l + 8 * n, 0);
    add(l + 8 * n, p + 4 * n, 0);
    return;
  }
  add(p, p * 2, 0);
  add(p, p * 2 + 1, 0);
  add(p * 2 + 4 * n, p + 4 * n, 0);
  add(p * 2 + 1 + 4 * n, p + 4 * n, 0);
  int m = (l + r) / 2;
  build(p * 2, l, m);
  build(p * 2 + 1, m + 1, r);
}
void addedge(int p, int l, int r, int u, long long w, int opt) {
  if (l <= tr[p].l && tr[p].r <= r) {
    if (opt == 2)
      add(u + 8 * n, p, w);
    else
      add(p + 4 * n, u + 8 * n, w);
    return;
  }
  int m = (tr[p].l + tr[p].r) / 2;
  if (l <= m) addedge(p * 2, l, r, u, w, opt);
  if (r > m) addedge(p * 2 + 1, l, r, u, w, opt);
}
int main() {
  scanf("%d %d %d", &n, &q, &s);
  build(1, 1, n);
  while (q--) {
    int opt, u, v, l, r;
    long long w;
    scanf("%d", &opt);
    if (opt == 1) {
      scanf("%d %d %lld", &u, &v, &w);
      add(u + 8 * n, v + 8 * n, w);
    } else {
      scanf("%d %d %d %lld", &u, &l, &r, &w);
      addedge(1, l, r, u, w, opt);
    }
  }
  memset(dis, 0x3f, sizeof(dis));
  dis[s + 8 * n] = 0;
  que.push((node){s + 8 * n, 0});
  while (!que.empty()) {
    int u = que.top().u;
    que.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (int i = head[u]; i; i = e[i].next) {
      int v = e[i].v;
      long long w = e[i].w;
      if (dis[v] > dis[u] + w) {
        dis[v] = dis[u] + w;
        que.push((node){v, dis[v]});
      }
    }
  }
  for (int i = 1; i <= n; i++)
    printf("%lld%c", dis[i + 8 * n] < inf ? dis[i + 8 * n] : -1,
           i == n ? '\n' : ' ');
  return 0;
}
