#include <bits/stdc++.h>
using namespace std;
int n, q, s, nu[100005], el, h[800005], l, r, x, t, W;
long long w[800005];
struct E {
  int l, to, w;
} e[5000005];
struct P {
  int d;
  long long w;
  bool operator<(const P& t) const {
    if (w != t.w) return w > t.w;
    return d > t.d;
  }
};
void EE(int x, int y, int s) {
  e[++el].to = y;
  e[el].l = h[x];
  h[x] = el;
  e[el].w = s;
}
priority_queue<P> Q;
void js(int z, int y, int c) {
  int g = (z == y) ? 0 : 4 * n;
  EE(c + g, n * 4 + (c >> 1), 0);
  if (z == y) {
    nu[z] = c;
    return;
  }
  int mid = z + y >> 1;
  EE(c, c << 1, 0);
  EE(c, c << 1 | 1, 0);
  js(z, mid, c << 1);
  js(mid + 1, y, c << 1 | 1);
}
void Ad(int z, int y, int c) {
  if (z > r || y < l) return;
  if (z >= l && y <= r) {
    if (t == 2) {
      EE(nu[x], c, W);
    } else {
      int g = (z == y) ? 0 : 4 * n;
      EE(c + g, nu[x], W);
    }
    return;
  }
  int mid = z + y >> 1;
  if (l <= mid) Ad(z, mid, c << 1);
  if (r > mid) Ad(mid + 1, y, c << 1 | 1);
}
void dj() {
  int d;
  long long z;
  w[nu[s]] = 0;
  Q.push({nu[s], 0});
  while (!Q.empty()) {
    d = Q.top().d;
    z = Q.top().w;
    Q.pop();
    if (z != w[d]) continue;
    for (int i = h[d]; i; i = e[i].l) {
      if (w[e[i].to] == -1 || z + e[i].w < w[e[i].to]) {
        w[e[i].to] = z + e[i].w;
        Q.push({e[i].to, w[e[i].to]});
      }
    }
  }
  for (int i = 1; i <= n; ++i) {
    printf("%I64d ", w[nu[i]]);
  }
}
int main() {
  memset(w, -1, sizeof(w));
  scanf("%d %d %d", &n, &q, &s);
  js(1, n, 1);
  for (int i = 1; i <= q; ++i) {
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d %d %d", &x, &l, &r);
      EE(nu[x], nu[l], r);
    } else {
      scanf("%d %d %d %d", &x, &l, &r, &W);
      Ad(1, n, 1);
    }
  }
  dj();
}
