const int maxn=1e5+10;
const int maxN=1e6+10;
const int M=5e5;
const int maxm=maxn<<2;
#define PIL pair<int,ll>
#define mkp make_pair
#define ls (u<<1)
#define rs (u<<1|1)
int n,m,s;
vector< PIL >tp[maxN];
int Idin[maxn];
void build(int u,int l,int r){
if(l==r){
Idin[l]=u;
return;
}
tp[u].emplace_back(mkp(ls,0));
tp[u].emplace_back(mkp(rs,0));
tp[ls+M].emplace_back(mkp(u+M,0));
tp[rs+M].emplace_back(mkp(u+M,0));
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void modify1(int u,int l,int r,int x,int y,ll w,int p){
if(y<l||r<x)return;
if(l>=x&&r<=y){
tp[p].emplace_back(mkp(u,w));
return;
}
int mid=l+r>>1;
if(mid>=x)modify1(ls,l,mid,x,y,w,p);
if(mid<y)modify1(rs,mid+1,r,x,y,w,p);
}
void modify2(int u,int l,int r,int x,int y,ll w,int p){
if(y<l||r<x)return;
if(l>=x&&r<=y){
tp[u+M].emplace_back(mkp(p,w));
return;
}
int mid=l+r>>1;
if(mid>=x)modify2(ls,l,mid,x,y,w,p);
if(mid<y)modify2(rs,mid+1,r,x,y,w,p);
}
ll dis[maxN];bool vis[maxN];
bool operator <(const PIL A,const PIL B){
return A.second>B.second;
}
priority_queue< PIL ,vector< PIL >,greater<PIL> >q;
void Dijstra(int s){
memset(dis,0x3f,sizeof dis);
dis[s]=0;
q.push(mkp(s,0));
while(!q.empty()){
PIL temp=q.top();
q.pop();
int u=temp.first;
if(vis[u]==1)continue;
vis[u]=1;
for(auto T:tp[u]){
int v=T.first;
if(dis[v]>dis[u]+T.second){
dis[v]=dis[u]+T.second;
q.push(mkp(v,dis[v]));
}
}
}
}
int main() {
read(n,m,s);
build(1,1,n);
for(int i(1);i<=n;++i){
tp[Idin[i]].emplace_back(mkp(Idin[i]+M,0));
tp[Idin[i]+M].emplace_back(mkp(Idin[i],0));
}
for(int i(1),op,u,l,r,w;i<=m;++i){
read(op);
if(op==1){
read(u,l,w);
tp[Idin[u]].emplace_back(mkp(Idin[l],w));
}
else if(op==2){
read(u,l,r,w);
modify1(1,1,n,l,r,w*1ll,Idin[u]+M);
}
else{
read(u,l,r,w);
modify2(1,1,n,l,r,w*1ll,Idin[u]);
}
}
Dijstra(Idin[s]);
for(int i(1);i<=n;++i){
write(dis[Idin[i]+M]==0x3f3f3f3f3f3f3f3fll?-1:dis[Idin[i]+M]);
}
return 0;
}