#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int E = N * 36;
const long long INF = 1LL << 60;
int n, q, s;
struct Edge {
  int v, w, nex;
} edges[E];
int head[N * 9];
int etot;
void init_graph() {
  memset(head, -1, sizeof(head));
  etot = 0;
}
inline void add_edge(int u, int v, int w) {
  edges[etot] = Edge{v, w, head[u]};
  head[u] = etot++;
}
int nd[2][N << 2];
int tot;
void build(int t, int o = 1, int l = 1, int r = n) {
  nd[t][o] = ++tot;
  if (l == r) {
    if (!t)
      add_edge(nd[t][o], l, 0);
    else
      add_edge(l, nd[t][o], 0);
    return;
  }
  int mid = l + r >> 1;
  build(t, o << 1, l, mid);
  build(t, o << 1 | 1, mid + 1, r);
  if (!t) {
    add_edge(nd[t][o], nd[t][o << 1], 0);
    add_edge(nd[t][o], nd[t][o << 1 | 1], 0);
  } else {
    add_edge(nd[t][o << 1], nd[t][o], 0);
    add_edge(nd[t][o << 1 | 1], nd[t][o], 0);
  }
}
int u, v, ql, qr, w;
void add(int t, int o, int l, int r) {
  if (ql > r || qr < l) return;
  if (ql <= l && r <= qr) {
    if (!t)
      add_edge(u, nd[t][o], w);
    else
      add_edge(nd[t][o], u, w);
    return;
  }
  int mid = l + r >> 1;
  add(t, o << 1, l, mid);
  add(t, o << 1 | 1, mid + 1, r);
}
long long d[N * 9];
bool done[N * 9];
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    pque;
void Dijkstra() {
  fill(d + 1, d + tot + 1, INF);
  d[s] = 0;
  pque.push({d[s], s});
  while (!pque.empty()) {
    int u = pque.top().second;
    pque.pop();
    if (done[u]) continue;
    done[u] = true;
    for (int i = head[u]; ~i; i = edges[i].nex) {
      int v = edges[i].v;
      int w = edges[i].w;
      if (d[v] > d[u] + w) {
        d[v] = d[u] + w;
        pque.push({d[v], v});
      }
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &q, &s);
  init_graph();
  tot = n;
  build(0);
  build(1);
  for (int i = 1; i <= q; ++i) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      scanf("%d%d%d", &u, &v, &w);
      add_edge(u, v, w);
    } else {
      scanf("%d%d%d%d", &u, &ql, &qr, &w);
      add(op - 2, 1, 1, n);
    }
  }
  Dijkstra();
  for (int i = 1; i <= n; ++i) {
    printf("%I64d", d[i] == INF ? -1 : d[i]);
    printf("%c", i < n ? ' ' : '\n');
  }
  return 0;
}
