#include<bits/stdc++.h>
using namespace std;
#define pl (p<<1)
#define pr (p<<1|1)
const int N=1e5+10,D=N<<2;
struct edge{int nxt,to,dis;}e[N*10];
struct node{int x,dis;};bool operator<(node x,node y){return x.dis>y.dis;}
int n,q,s,op,l,r,v,w,cnt,num[N],vis[N*10],dis[N*10],head[N*10];
void add(int a,int b,int c){++cnt,e[cnt].to=b,e[cnt].nxt=head[a],e[cnt].dis=c,head[a]=cnt;}
void build(int l,int r,int p){
if(l==r)return void(num[l]=p);
add(p,pl,0),add(p,pr,0),add(pl+D,p+D,0),add(pr+D,p+D,0);
int mid=l+r>>1;
build(l,mid,pl),build(mid+1,r,pr);
}void update(int l,int r,int le,int ri,int v,int w,int p){
if(l>=le&&r<=ri){
if(op==3)add(p+D,v,w);
else add(v+D,p,w);
return;
}int mid=l+r>>1;
if(le<=mid)update(l,mid,le,ri,v,w,pl);
if(ri>mid)update(mid+1,r,le,ri,v,w,pr);
}void dij(int s){
memset(dis,0x3f,sizeof dis),dis[s]=0;
priority_queue<node>q;q.push({0,s});
while(!q.empty()){
node f=q.top();q.pop();int x=f.x;
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt){
int t=e[i].to;
if(dis[t]>dis[x]+e[i].dis)dis[t]=dis[x]+e[i].dis,q.push({dis[t],t});
}
}
}int main(){
cin>>n>>q>>s,build(1,n,1);
for(int i=1,f;i<=n;i++)f=num[i],add(f,f+D,0),add(f+D,f,0);
while(q--){
cin>>op;
if(op==1)cin>>l>>r>>w,add(num[l]+D,num[r],w);
else cin>>v>>l>>r>>w,update(1,n,l,r,num[v],w,1);
}dij(num[s]+D);
for(int i=1;i<=n;i++)cout<<(dis[num[i]]==0x3f3f3f3f?-1:dis[num[i]])<<' ';
return 0;
}