RT,Dij70分
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define N 1414514
#define pii pair<int ,int >
#define mp make_pair
using namespace std;
int n,m,head[N],from[N],to[N],nxt[N],tot,dc[N],cnt,co[N],col,st[N],dfn[N],low[N],top,val[N];
int xs[N];
bool vis[N];
int he[N],ver[N],ne[N],va[N],tott,s,dis[N],ans=-0x7ff;
void add(int u,int v,int w,int d){
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
val[tot]=w;
xs[tot]=d;
from[tot]=u;
}
void add1(int u,int v,int w){
ver[++tott]=v;
ne[tott]=he[u];
he[u]=tott;
va[tott]=w;
}
void tarjan(int x){
dfn[x]=low[x]=++cnt;
st[++top]=x;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);
else if(!co[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
co[x]=++col;
while(st[top]!=x)co[st[top--]]=col;
top--;
}
}
void dijkstra(int s){
priority_queue<pii>q;
q.push(mp(dc[s],s));
dis[s]=dc[s];
while(!q.empty()){
ans=max(ans,q.top().first);
int x=q.top().second;q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=he[x];i;i=ne[i]){
int y=ver[i];
if(dis[y]<dis[x]+va[i]+dc[y]){
dis[y]=dis[x]+va[i]+dc[y];
q.push(mp(dis[y],y));
}
}
}
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b,c;double d;
scanf("%d%d%d%lf",&a,&b,&c,&d);
add(a,b,c,d*10);
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=m;i++){
if(co[from[i]]==co[to[i]]){
int sb=val[i];
while(sb){
dc[co[from[i]]]+=sb;
sb=(sb*xs[i])/10;
}
}
else add1(co[from[i]],co[to[i]],val[i]);
}
scanf("%d",&s);
dijkstra(co[s]);
for(int i=1;i<=col;i++)ans=max(ans,dis[i]);
printf("%d",ans);
return 0;
}