#include <bits/stdc++.h>
namespace IO{
#define LL long long
inline LL read(){
LL x=0,f=1;char c=getchar();
for (;!isdigit(c);c=getchar())if (c=='-')f=-1;
for (;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
inline void write(LL x,char c='\n'){
if (x){
if (x<0)x=-x,putchar('-');
char a[30];short l;
for (l=0;x;x/=10)a[l++]=x%10^48;
for (l--;l>=0;l--)putchar(a[l]);
}else putchar('0');putchar(c);
}
}using namespace IO;
using namespace std;
#define pii pair<int,int>
const int N = 6e4+10;
const int M = 2e6+10;
const int E = 5e6+10;
const int L = 2e7+10;
const int INF = 0x3f3f3f3f;
struct Tree{int to,nxt;}tr[N<<1];
struct Edge{int to,nxt,val;}ed[L];
struct Query{int x,y,a,b,val;}q[M];
int ht[N],tott,hd[E],tote,dis[E],fa[N],n,m,s,totq;
int dep[N],f[N][20],in[N][20],out[N][20],lnode,tim;
void addt(int x,int y){tr[++tott]={y,ht[x]};ht[x]=tott;}
void adde(int x,int y,int z){ed[++tote]={y,hd[x],z};hd[x]=tote;}
bool cmp(int x,int y){return dis[x]<dis[y];}
int Getfa(int x){return fa[x]==x?x:fa[x]=Getfa(fa[x]);}
void dfs(int x,int father){
f[x][0]=father;
dep[x]=dep[father]+1;
in[x][0]=++tim;
adde(tim,x,0);
adde(tim,father,0);
out[x][0]=++tim;
adde(x,tim,0);
adde(father,tim,0);
for (int i=0;i<lnode;i++)
f[x][i+1]=f[f[x][i]][i],
in[x][i+1]=++tim,
adde(tim,in[x][i],0),
adde(tim,in[f[x][i]][i],0),
out[x][i+1]=++tim,
adde(out[x][i],tim,0),
adde(out[f[x][i]][i],tim,0);
for (int i=ht[x];i;i=tr[i].nxt){
int y=tr[i].to;
if (y==father)continue;
dfs(y,x);
}
}
void lca1(int x,int y,int k){
if (dep[x]<dep[y])swap(x,y);
adde(y,k,0);
for (int i=lnode;i>=0;i--)
if (dep[f[x][i]]>=dep[y])
adde(out[x][i],k,0),x=f[x][i];
if (x==y)return ;
for (int i=lnode;i>=0;i--)
if (f[x][i]!=f[y][i])
adde(out[x][i],k,0),x=f[x][i],
adde(out[y][i],k,0),y=f[y][i];
adde(out[x][0],k,0);
}
void lca2(int x,int y,int k){
if (dep[x]<dep[y])swap(x,y);
adde(k,y,0);
for (int i=lnode;i>=0;i--)
if (dep[f[x][i]]>=dep[y])
adde(k,in[x][i],0),x=f[x][i];
if (x==y)return ;
for (int i=lnode;i>=0;i--)
if (f[x][i]!=f[y][i])
adde(k,in[x][i],0),x=f[x][i],
adde(k,in[y][i],0),y=f[y][i];
adde(k,in[x][0],0);
}
void dijkstra(int s){
memset(dis,0x3f,sizeof(dis));dis[s]=0;
priority_queue<pii,vector<pii>,greater<pii> > que;
que.push({0,s});
while (!que.empty()){
pii x=que.top();
que.pop();
if (x.first>dis[x.second])continue;
for (int i=hd[x.second];i;i=ed[i].nxt){
int y=ed[i].to;
if (dis[y]>x.first+ed[i].val)
dis[y]=x.first+ed[i].val,
que.push({dis[y],y});
}
}
}
int main(){
n=read(),m=read(),s=read(),tim=n;
while ((1<<lnode)<=n)lnode++;lnode--;
for (int i=1;i<=n;i++)fa[i]=i;
while (m--){
int opt=read();
if (opt==1){
int x=read(),y=read(),a=read(),b=read(),val=read();
if (Getfa(x)!=Getfa(y)||Getfa(a)!=Getfa(b))continue;
q[++totq]={x,y,a,b,val};
}
else{
int x=read(),y=read(),a=Getfa(x),b=Getfa(y),val=read();
if (a==b)continue;
addt(x,y);
addt(y,x);
adde(x,y,val);
adde(y,x,val);
fa[a]=b;
}
}
for (int i=1;i<=n;i++)
if (!dep[i])
dfs(i,0);
for (int i=1;i<=totq;i++)
lca1(q[i].x,q[i].y,++tim),
lca2(q[i].a,q[i].b,++tim),
adde(tim-1,tim,q[i].val);
dijkstra(s);
for (int i=1;i<=n;i++)write(dis[i]==INF?-1:dis[i],' ');
return 0;
}