#include <bits/stdc++.h>
using namespace std;
const int N = 500100;
int n, q, s;
int tot = 0;
int nd[2][N];
long long dist[N];
int vis[N];
vector<pair<int, int> > adj[N];
vector<int> ve;
void add(int u, int v, int w) { adj[u].push_back({v, w}); }
void build(int t, int p, int l, int r) {
  nd[t][p] = ++tot;
  if (l == r) {
    if (t == 0) add(nd[0][p], l, 0);
    if (t == 1) add(l, nd[1][p], 0);
    return;
  }
  int m = (l + r) / 2;
  build(t, 2 * p, l, m);
  build(t, 2 * p + 1, m + 1, r);
  if (t == 0) {
    add(nd[0][p], nd[0][2 * p], 0);
    add(nd[0][p], nd[0][2 * p + 1], 0);
  } else {
    add(nd[1][2 * p], nd[1][p], 0);
    add(nd[1][2 * p + 1], nd[1][p], 0);
  }
}
void query(int t, int p, int l, int r, int tl, int tr) {
  if (tl == l && tr == r) {
    ve.push_back(nd[t][p]);
  } else {
    int m = (l + r) / 2;
    if (tr <= m)
      query(t, 2 * p, l, m, tl, tr);
    else if (tl > m)
      query(t, 2 * p + 1, m + 1, r, tl, tr);
    else
      query(t, 2 * p, l, m, tl, m), query(t, 2 * p + 1, m + 1, r, m + 1, tr);
  }
}
void dijkstra(int s, int n) {
  for (int i = 0; i < n; ++i) {
    dist[i] = 1LL << 60, vis[i] = 0;
  }
  dist[s] = 0;
  set<pair<long long, int> > st;
  for (int i = 0; i < n; ++i) {
    st.insert(make_pair(dist[i], i));
  }
  for (int i = 0; i < n; ++i) {
    int u = st.begin()->second;
    st.erase(st.begin());
    vis[u] = 1;
    for (int j = 0; j < adj[u].size(); ++j) {
      int v = adj[u][j].first;
      if (dist[v] > dist[u] + adj[u][j].second) {
        st.erase(make_pair(dist[v], v));
        dist[v] = dist[u] + adj[u][j].second;
        st.insert(make_pair(dist[v], v));
      }
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &q, &s);
  s--;
  tot = n + 2;
  build(0, 1, 0, n - 1);
  build(1, 1, 0, n - 1);
  for (int i = 0; i < q; ++i) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      int v, u, w;
      scanf("%d%d%d", &v, &u, &w);
      v--, u--;
      add(v, u, w);
    } else {
      int v, l, r, w;
      scanf("%d%d%d%d", &v, &l, &r, &w);
      v--, l--, r--;
      ve.clear();
      query(t - 2, 1, 0, n - 1, l, r);
      if (t == 2) {
        for (int u : ve) {
          add(v, u, w);
        }
      } else {
        for (int u : ve) {
          add(u, v, w);
        }
      }
    }
  }
  dijkstra(s, tot);
  for (int i = 0; i < n; ++i) {
    if (dist[i] >= (1ll << 50)) dist[i] = -1;
    printf("%lld ", dist[i]);
  }
}
