#include <bits/stdc++.h>
using namespace std;
template <typename T>
void cmax(T& a, T b) {
  a = max(a, b);
}
template <typename T>
void cmin(T& a, T b) {
  a = min(a, b);
}
void _BG(const char* s) {}
template <typename T, typename... TT>
void _BG(const char* s, T a, TT... b) {
  for (int c = 0; *s && (c || *s != ','); ++s) {
    cerr << *s;
    switch (*s) {
      case '(':
      case '[':
      case '{':
        ++c;
        break;
      case ')':
      case ']':
      case '}':
        --c;
        break;
    }
  }
  cerr << " = " << a;
  if (*s) {
    cerr << ", ";
    _BG(++s, b...);
  } else
    cerr << endl;
}
bool RD(void) { return true; }
bool RD(char& a) { return scanf(" %c", &a) == 1; }
bool RD(char* a) { return scanf("%s", a) == 1; }
bool RD(double& a) { return scanf("%lf", &a) == 1; }
bool RD(int& a) { return scanf("%d", &a) == 1; }
bool RD(long long& a) { return scanf("%lld", &a) == 1; }
template <typename T, typename... TT>
bool RD(T& a, TT&... b) {
  return RD(a) && RD(b...);
}
void PT(const char a) { putchar(a); }
void PT(const char* a) { fputs(a, stdout); }
void PT(char* a) { fputs(a, stdout); }
void PT(const double a) { printf("%.16f", a); }
void PT(const int a) { printf("%d", a); }
void PT(const long long a) { printf("%lld", a); }
template <char sep = ' ', char end = '\n'>
void PL(void) {
  if (end) PT(end);
}
template <char sep = ' ', char end = '\n', typename T, typename... TT>
void PL(const T a, const TT... b) {
  PT(a);
  if (sizeof...(b) && sep) PT(sep);
  PL<sep, end>(b...);
}
const int N = 1e5 + 87;
const long long inf = 1e15;
int n;
pair<pair<int, int>, int> e[N];
vector<int> g[N * 4];
struct node {
  long long tg;
  pair<long long, int> p;
} t[N * 4];
void add(int o, int l, int r, int i, int j, int x) {
  if (r <= i || j <= l) return;
  if (i <= l && r <= j) {
    g[o].push_back(x);
    return;
  }
  int m = (l + r) / 2;
  add(o + o + 1, l, m, i, j, x);
  add(o + o + 2, m, r, i, j, x);
}
void pull(int o) {
  t[o].p = {inf, n};
  if (t[o + o + 1].p.second < n) cmin(t[o].p, t[o + o + 1].p);
  if (t[o + o + 2].p.second < n) cmin(t[o].p, t[o + o + 2].p);
}
void bld(int o, int l, int r) {
  t[o].tg = inf;
  if (r - l == 1) {
    t[o].p = {inf, l};
    return;
  }
  int m = (l + r) / 2;
  bld(o + o + 1, l, m);
  bld(o + o + 2, m, r);
  pull(o);
}
void upd(int o, long long x) {
  if (x < t[o].tg) {
    t[o].tg = x;
    if (t[o].p.second < n) cmin(t[o].p.first, x);
  }
}
void push(int o) {
  upd(o + o + 1, t[o].tg);
  upd(o + o + 2, t[o].tg);
}
void upd(int o, int l, int r, int i, int j, long long x) {
  if (r <= i || j <= l || t[o].tg <= x) return;
  if (i <= l && r <= j) {
    upd(o, x);
    return;
  }
  int m = (l + r) / 2;
  push(o);
  upd(o + o + 1, l, m, i, j, x);
  upd(o + o + 2, m, r, i, j, x);
  pull(o);
}
void del(int o, int l, int r, int i) {
  if (r - l == 1) {
    t[o].p.second = n;
    return;
  }
  int m = (l + r) / 2;
  push(o);
  if (i < m)
    del(o + o + 1, l, m, i);
  else
    del(o + o + 2, m, r, i);
  pull(o);
}
void go(int o, int l, int r, int u, long long w) {
  if (((int)g[o].size())) {
    for (int i : g[o])
      if (e[i].second) {
        upd(0, 0, n, e[i].first.first, e[i].first.second, w + e[i].second);
        e[i].second = 0;
      }
    g[o].clear();
  }
  if (r - l == 1) return;
  int m = (l + r) / 2;
  if (u < m)
    go(o + o + 1, l, m, u, w);
  else
    go(o + o + 2, m, r, u, w);
}
void pr(int o, int l, int r) {
  if (r - l == 1) {
    long long w = t[o].p.first;
    PL<0, 0>(w == inf ? -1 : w, " \n"[r == n]);
    return;
  }
  int m = (l + r) / 2;
  pr(o + o + 1, l, m);
  pr(o + o + 2, m, r);
}
int main() {
  int q, s;
  RD(n, q, s);
  --s;
  for (int i(0), _B(q); i < _B; ++i) {
    int t;
    RD(t);
    int l, r;
    if (t == 1) {
      int u;
      RD(u);
      int v;
      RD(v);
      int w;
      RD(w);
      --u, --v;
      e[i] = {{v, v + 1}, w};
      l = u, r = u + 1;
    } else if (t == 2) {
      int u;
      RD(u);
      int vl;
      RD(vl);
      int vr;
      RD(vr);
      int w;
      RD(w);
      --u, --vl;
      e[i] = {{vl, vr}, w};
      l = u, r = u + 1;
    } else {
      int v;
      RD(v);
      int ul;
      RD(ul);
      int ur;
      RD(ur);
      int w;
      RD(w);
      --v, --ul;
      e[i] = {{v, v + 1}, w};
      l = ul, r = ur;
    }
    add(0, 0, n, l, r, i);
  }
  bld(0, 0, n);
  upd(0, 0, n, s, s + 1, 0);
  while (t[0].p.second != n && t[0].p.first != inf) {
    int u;
    long long w;
    tie(w, u) = t[0].p;
    del(0, 0, n, u);
    go(0, 0, n, u, w);
  }
  pr(0, 0, n);
}
