#include<bits/stdc++.h>
using namespace std;
const int maxN=80010;
struct node{
int to,val,mx;
};
stack<int> s;
queue<int> q;
vector<node> v[maxN],v2[maxN];
int dfn[maxN],low[maxN],siz[maxN],bl[maxN],inn[maxN],dp[maxN],f[maxN],stp,y;
bool book[maxN];
void dfs(int x){
low[x]=dfn[x]=++stp;
s.push(x);
book[x]=1;
for(int i=0;i<v[x].size();i++){
y=v[x][i].to;
if(dfn[y]==0){
dfs(y);
low[x]=min(low[x],low[y]);
}
else if(book[y]==1) low[x]=min(low[x],low[y]);
}
if(dfn[x]==low[x]){
do{
y=s.top();
s.pop();
siz[x]++;
bl[y]=x;
book[y]=0;
}while(x!=y);
}
}
void find_cnt(int x){
book[x]=1;
for(int i=0;i<v[x].size();i++){
int y=v[x][i].to;
if(bl[y]==bl[x]){
f[bl[x]]+=v[x][i].mx;
if(!book[y]) find_cnt(y);
} else {
v2[bl[x]].push_back(node{bl[y],v[x][i].val,0});
inn[bl[y]]++;
}
}
}
int main(){
int n,m,st,a,b,c;
double d;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b>>c>>d;
int mx=0,e=c;
while(e){
mx+=e;
e*=d;
}
v[a].push_back(node{b,c,mx});
}
cin>>st;
dfs(st);
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++){
if(siz[i]){
find_cnt(i);
dp[i]=f[i];
}
}
memset(book,0,sizeof(book));
q.push(bl[st]);
book[bl[st]]=1;
while(!q.empty()){
int p=q.front();
q.pop();
for(int i=0;i<v2[p].size();i++){
y=v2[p][i].to;
inn[y]--;
dp[y]=max(dp[y],dp[p]+v2[p][i].val+f[y]);
if(!inn[y] && !book[y]){
q.push(y);
book[y]=1;
}
}
}
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
cout<<ans;
return 0;
}