#include <bits/stdc++.h>
using namespace std;
int cnt;
int root1,root2;
struct node{
int l,r,ls,rs;
}tree[800005];
vector<int>a[800005],b[800005];
int in[200005],out[200005];
void build1(int l,int r,int w){
tree[w].l=l,tree[w].r=r;
if (l==r){
in[l]=w;
return;
}
int mid=(l+r)/2;
tree[w].ls=++cnt;
tree[w].rs=++cnt;
a[w].push_back(tree[w].ls);
a[w].push_back(tree[w].rs);
b[w].push_back(0);
b[w].push_back(0);
build1(l,mid,tree[w].ls);
build1(mid+1,r,tree[w].rs);
}
void build2(int l,int r,int w){
tree[w].l=l,tree[w].r=r;
if (l==r){
out[l]=w;
return;
}
int mid=(l+r)/2;
tree[w].ls=++cnt;
tree[w].rs=++cnt;
a[tree[w].ls].push_back(w);
a[tree[w].rs].push_back(w);
b[tree[w].ls].push_back(0);
b[tree[w].rs].push_back(0);
build2(l,mid,tree[w].ls);
build2(mid+1,r,tree[w].rs);
}
void update1(int from,int l,int r,int w,int s){
if (tree[w].l>=l&&tree[w].r<=r){
a[from].push_back(w);
b[from].push_back(s);
return;
}
int mid=(tree[w].l+tree[w].r)/2;
if (l<=mid) update1(from,l,r,tree[w].ls,s);
if (mid<r) update1(from,l,r,tree[w].rs,s);
}
void update2(int from,int l,int r,int w,int s){
if (tree[w].l>=l&&tree[w].r<=r){
a[w].push_back(from);
b[w].push_back(s);
return;
}
int mid=(tree[w].l+tree[w].r)/2;
if (l<=mid) update2(from,l,r,tree[w].ls,s);
if (mid<r) update2(from,l,r,tree[w].rs,s);
}
struct wtz{
int w;
long long dis;
friend bool operator<(wtz x,wtz y){
return x.dis>y.dis;
}
};
long long oo=1e18,dis[800005];
bool vis[800005];
priority_queue<wtz>q;
void dij(int s){
for(int i=1;i<=cnt;i++) dis[i]=oo;
dis[s]=0;
wtz p;p.w=s,p.dis=0;q.push(p);
while(!q.empty()){
wtz rt=q.top();
q.pop();
if (vis[rt.w]) continue;
vis[rt.w]=1;
for(int i=0;i<a[rt.w].size();i++){
if (dis[rt.w]+b[rt.w][i]<dis[a[rt.w][i]]){
dis[a[rt.w][i]]=dis[rt.w]+b[rt.w][i];
wtz nm;
nm.w=a[rt.w][i];nm.dis=dis[nm.w];
q.push(nm);
}
}
}
}
int main(){
ios::sync_with_stdio(false);
int n,m,s;
cin>>n>>m>>s;
build1(1,n,root1=++cnt);
build2(1,n,root2=++cnt);
for(int i=1;i<=n;i++){
a[in[i]].push_back(out[i]);
a[out[i]].push_back(in[i]);
b[in[i]].push_back(0);
b[out[i]].push_back(0);
}
for(int i=1;i<=m;i++){
int op;
cin>>op;
if (op==1){
int u,v,w;
cin>>u>>v>>w;
a[in[u]].push_back(out[v]);
b[in[u]].push_back(w);
}
else if (op==2){
int u,l,r,w;
cin>>u>>l>>r>>w;
update1(in[u],l,r,root2,w);
}
else{
int l,r,u,w;
cin>>l>>r>>u>>w;
update2(out[u],l,r,root1,w);
}
}
dij(in[s]);
for(int i=1;i<=n;i++) cout<<(dis[out[i]]>=oo?-1:dis[out[i]])<<" ";
return 0;
}