#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;
struct edge {
  int u, v, w;
};
vector<edge> G[maxn * 2];
int id(int l, int r) { return l + r | l != r; }
int ind[maxn];
void add(int u, int v, int w) { G[u].push_back((edge){u, v, w}); }
int n, q, s;
void Add2(int l, int r, int v, int l0, int r0, int w) {
  if (l0 <= l && r0 >= r) {
    add(id(v, v), id(l, r), w);
    return;
  }
  int mid = (l + r) >> 1;
  if (l0 <= mid) Add2(l, mid, v, l0, r0, w);
  if (r0 > mid) Add2(mid + 1, r, v, l0, r0, w);
}
int more = 2e5 + 10;
void Add3(int l, int r, int v, int l0, int r0, int w) {
  if (l0 <= l && r0 >= r) {
    add(id(l, r) + more, id(v, v) + more, w);
    return;
  }
  int mid = (l + r) >> 1;
  if (l0 <= mid) Add3(l, mid, v, l0, r0, w);
  if (r0 > mid) Add3(mid + 1, r, v, l0, r0, w);
}
void build(int l, int r) {
  for (int i = l; i <= r; i++) {
    add(id(l, r), ind[i], 0);
    add(ind[i], id(l, r) + more, 0);
  }
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(l, mid);
  build(mid + 1, r);
}
long long inf = 1LL << 61;
long long d[maxn * 2];
void dijk(int s) {
  priority_queue<pair<long long, int>, vector<pair<long long, int> >,
                 greater<pair<long long, int> > >
      q;
  for (int i = 0; i < maxn * 2; i++) d[i] = inf;
  q.push({d[s] = 0, s});
  while (!q.empty()) {
    int u = q.top().second;
    if (d[u] != q.top().first) {
      q.pop();
      continue;
    }
    q.pop();
    for (auto e : G[u]) {
      if (d[e.v] > d[u] + e.w) {
        d[e.v] = d[u] + e.w;
        q.push({d[e.v], e.v});
      }
    }
  }
}
int main() {
  cin >> n >> q >> s;
  for (int i = 1; i <= n; i++) ind[i] = int(4e5 + 2000) + i;
  build(1, n);
  for (int i = 1; i <= n; i++) {
    add(ind[i], id(i, i), 0);
    add(id(i, i) + more, ind[i], 0);
  }
  for (int i = 1; i <= q; i++) {
    int t;
    scanf("%d", &t);
    int l, r, v, w;
    if (t == 1) {
      scanf("%d%d%d", &v, &l, &w);
      Add2(1, n, v, l, l, w);
    } else if (t == 2) {
      scanf("%d%d%d%d", &v, &l, &r, &w);
      Add2(1, n, v, l, r, w);
    } else {
      scanf("%d%d%d%d", &v, &l, &r, &w);
      Add3(1, n, v, l, r, w);
    }
  }
  dijk(ind[s]);
  for (int i = 1; i <= n; i++) {
    long long v = d[ind[i]];
    printf("%lld%c", v == inf ? -1 : v, " \n"[i == n]);
  }
  return 0;
}
