#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n, m, s, lst[400005], nxt[400005 << 4], ed[400005 << 4],
    len[400005 << 4], tot, dis[400005], vis[400005], id[400005 << 2][2];
struct node {
  long long id, dis;
};
long long cnt;
inline bool operator<(node a, node b) { return a.dis > b.dis; }
inline void add_e(long long x, long long y, long long z) {
  ed[++tot] = y, nxt[tot] = lst[x], lst[x] = tot, len[tot] = z;
}
void build(long long p, long long l, long long r, long long tp) {
  if (l == r) {
    id[p][tp] = l;
    return;
  };
  long long mid = (l + r) >> 1;
  id[p][tp] = ++cnt;
  build(p << 1, l, mid, tp);
  build(p << 1 | 1, mid + 1, r, tp);
  if (tp == 1)
    add_e(id[p][tp], id[p << 1][tp], 0),
        add_e(id[p][tp], id[p << 1 | 1][tp], 0);
  else
    add_e(id[p << 1][tp], id[p][tp], 0),
        add_e(id[p << 1 | 1][tp], id[p][tp], 0);
}
void add1(long long p, long long x, long long y, long long k, long long l,
          long long r, long long w, long long tp) {
  if (x <= l && y >= r) {
    tp == 1 ? add_e(k, id[p][tp], w) : add_e(id[p][tp], k, w);
    return;
  }
  long long mid = (l + r) >> 1;
  if (x <= mid && y >= l) add1(p << 1, x, y, k, l, mid, w, tp);
  if (y > mid && x <= r) add1(p << 1 | 1, x, y, k, mid + 1, r, w, tp);
}
inline void add(long long l1, long long r1, long long l2, long long r2,
                long long w, long long k) {
  if (k == 1) {
    add_e(l1, l2, w);
    return;
  }
  if (k == 2) {
    add1(1, l2, r2, l1, 1, n, w, 1);
  } else {
    add1(1, l1, r1, l2, 1, n, w, 2);
  }
}
inline void dijkstra() {
  priority_queue<node> q;
  q.push((node){s, 0});
  memset(dis, 0x3f, sizeof(dis));
  dis[s] = 0;
  while (!q.empty()) {
    long long u = q.top().id;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (long long i = lst[u]; i; i = nxt[i]) {
      if (!vis[ed[i]] && dis[ed[i]] > dis[u] + len[i]) {
        dis[ed[i]] = dis[u] + len[i];
        q.push((node){ed[i], dis[ed[i]]});
      }
    }
  }
}
int main() {
  scanf("%lld%lld%lld", &n, &m, &s);
  cnt = n;
  build(1, 1, n, 1);
  build(1, 1, n, 2);
  for (long long i = 1; i <= m; i++) {
    long long k;
    scanf("%lld", &k);
    if (k == 1) {
      long long x, y, z;
      scanf("%lld%lld%lld", &x, &y, &z);
      add(x, x, y, y, z, k);
    } else {
      long long x, l, r, z;
      scanf("%lld%lld%lld%lld", &x, &l, &r, &z);
      if (k == 3)
        add(l, r, x, x, z, k);
      else
        add(x, x, l, r, z, k);
    }
  }
  dijkstra();
  for (long long i = 1; i <= n; i++)
    printf("%lld ", dis[i] == 0x3f3f3f3f3f3f3f3f ? -1 : dis[i]);
  return 0;
}
