#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
const int inf=0x3f3f3f3f3f3f3f3f;
const int B=5e5;
int n,m,s,cnt,head[N<<2],yz[N],dis[N<<2],vis[N];
struct node{
int u,v,w,nxt;
}a[N<<5];
void add(int u,int v,int w){
a[++cnt]=(node){u,v,w,head[u]};
head[u]=cnt;
}
void build(int k,int l,int r){
if(l==r){
yz[l]=k;
return ;
}
int mid=(l+r)>>1;
add(k,k<<1,0); add(k,k<<1|1,0);
add(B+(k<<1),k+B,0); add(B+(k<<1|1),k+B,0);
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void Add(int k,int l,int r,int fl,int fr,int b,int val,int op){
if(l>=fl&&r<=fr){
if(op==0){//u -> l,r
add(b,k,val);
return ;
}
else {
add(k+B,b,val);
return ;
}
}
int mid=(l+r)>>1;
if(fl<=mid)
Add(k<<1,l,mid,fl,fr,b,val,op);
if(fr>mid)
Add(k<<1|1,mid+1,r,fl,fr,b,val,op);
return ;
}
priority_queue<pair<int,int> , vector<pair<int,int> > , greater<pair<int,int> > >q;
void dij(int x){
for(int i=1;i<=N;++i) dis[i]=0x3f;
dis[x]=0;
q.push(make_pair(0,x));
while(!q.empty()){
int now=q.top().second;
q.pop();
if(vis[now]) continue;
vis[now]=1;
for(int i=head[now];i;i=a[i].nxt){
int v=a[i].v;
if(dis[v]>dis[now]+a[i].w){
dis[v]=dis[now]+a[i].w;
q.push(make_pair(dis[v],v));
}
}
}
}
signed main(){
cin>>n>>m>>s;
build(1,1,n);
for(int i=1;i<=m;++i){
int op,b,l,r,val;
cin>>op>>b>>l;
if(op==1){
cin>>val;
add(yz[b],yz[l],val);
}
else {
cin>>r>>val;
Add(1,1,n,l,r,yz[b],val,op%2);
}
}
for(int i=1;i<=n;++i) add(yz[i],yz[i]+B,0),add(yz[i]+B,yz[i],0);
dij(yz[s]);
for(int i=1;i<=n;++i){
if(dis[yz[i]]==inf) cout<<"-1"<<'\n';
else cout<<dis[yz[i]]<<'\n';
}
return 0;
}
样例都过不了Q-Q