#include <bits/stdc++.h>
using namespace std;
struct edge {
  int v, next;
  long long w;
} side[5000100];
struct node {
  int l, r;
  int w;
} t[2][400010];
int cnt = 0, head[800100], num, vis[800100];
long long d[800100];
void add(int u, int v, long long w) {
  side[cnt].v = v;
  side[cnt].w = w;
  side[cnt].next = head[u];
  head[u] = cnt++;
}
void build(int k, int l, int r, int f) {
  t[f][k].l = l;
  t[f][k].r = r;
  t[f][k].w = ++num;
  if (r == l) {
    if (f == 0)
      add(t[f][k].w, l, 0);
    else
      add(l, t[f][k].w, 0);
    return;
  }
  int mid = (l + r) / 2;
  build(k * 2, l, mid, f);
  build(k * 2 + 1, mid + 1, r, f);
  if (f == 0) {
    add(t[f][k].w, t[f][k * 2].w, 0);
    add(t[f][k].w, t[f][k * 2 + 1].w, 0);
  } else {
    add(t[f][k * 2].w, t[f][k].w, 0);
    add(t[f][k * 2 + 1].w, t[f][k].w, 0);
  }
}
vector<int> vv;
void query(int k, int v, int l, int r, long long w, int f) {
  if (t[f][k].l >= l && t[f][k].r <= r) {
    vv.push_back(t[f][k].w);
    return;
  }
  int mid = (t[f][k].l + t[f][k].r) / 2;
  if (l <= mid) query(k * 2, v, l, r, w, f);
  if (r > mid) query(k * 2 + 1, v, l, r, w, f);
}
void spfa(int s) {
  priority_queue<pair<long long, int>, vector<pair<long long, int> >,
                 greater<pair<long long, int> > >
      st;
  st.push(make_pair(0, s));
  vis[s] = 1;
  d[s] = 0;
  while (!st.empty()) {
    int u = st.top().second;
    st.pop();
    vis[u] = 0;
    for (int i = head[u]; i != -1; i = side[i].next) {
      int v = side[i].v;
      long long y = side[i].w;
      if (d[u] + y < d[v]) {
        d[v] = d[u] + y;
        if (!vis[v]) {
          st.push(make_pair(d[v], v));
          vis[v] = 1;
        }
      }
    }
  }
}
int main() {
  int n, q, s, u, v, r, l, t;
  long long w;
  memset(head, -1, sizeof(head));
  memset(vis, 0, sizeof(vis));
  scanf("%d%d%d", &n, &q, &s);
  num = n;
  build(1, 1, n, 0);
  build(1, 1, n, 1);
  for (int i = 1; i <= num; i++) {
    d[i] = 1e18 + 10;
  }
  while (q--) {
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d %d %lld", &u, &v, &w);
      add(u, v, w);
    } else if (t == 2) {
      scanf("%d %d %d %lld", &v, &l, &r, &w);
      vv.clear();
      query(1, v, l, r, w, 0);
      for (int i = 0; i < vv.size(); i++) add(v, vv[i], w);
    } else if (t == 3) {
      scanf("%d %d %d %lld", &v, &l, &r, &w);
      vv.clear();
      query(1, v, l, r, w, 1);
      for (int i = 0; i < vv.size(); i++) add(vv[i], v, w);
    }
  }
  spfa(s);
  for (int i = 1; i <= n; i++) {
    if (d[i] >= 1e18 + 10)
      printf("-1 ");
    else
      printf("%lld ", d[i]);
  }
  cout << endl;
}
