#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define X 351
int n,m,s,t,x,y,u[X][X],v[X][X],r,z,e[X],d[X],f[X],p[X];
vector<int> c[X];
char w[X];
queue<int> q;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> h;
bool E()
{
for(memset(d,0x3f,sizeof(d)),d[s]=f[s]=0,h.push(make_pair(d[s],s));!h.empty();)
{
int cst=h.top().first,nod=h.top().second;
h.pop();
if(d[nod]!=cst)
continue;
for(vector<int>::iterator it=c[nod].begin();it!=c[nod].end();it++)
if(u[nod][*it])
{
int new_d=d[nod]+v[nod][*it]+e[nod]-e[*it];
if(new_d<d[*it])
d[*it]=new_d,f[*it]=f[nod]+v[nod][*it],p[*it]=nod,h.push(make_pair(d[*it],*it));
}
}
memcpy(e,f,sizeof(d));
if(d[t]==0x3f3f3f3f)
return false;
int Min=0x3f3f3f3f,curCst=0;
for(int aux=t;aux!=s;aux=p[aux])
Min=min(Min,u[p[aux]][aux]),curCst+=v[p[aux]][aux];
r+=Min,z+=Min*f[t];
for(int aux=t;aux!=s;aux=p[aux])
u[p[aux]][aux]-=Min,u[aux][p[aux]]+=Min;
return true;
}
bool B()
{
memset(e,0x3f,sizeof(e)),e[s]=0;
for(q.push(s),w[s]=1;!q.empty();q.pop())
{
int i=q.front();
w[i]=0;
for(vector<int>::iterator it=c[i].begin();it!=c[i].end();it++)
if(u[i][*it])
{
if(e[i]+v[i][*it]>=e[*it])
continue;
e[*it]=e[i]+v[i][*it];
if(w[*it])
continue;
w[*it]=1,q.push(*it);
}
}
return e[t]==0x3f3f3f3f?false:true;
}
int main()
{
freopen("fmcm.in","r",stdin),freopen("fmcm.out","w",stdout),scanf("%d%d%d%d",&n,&m,&s,&t);
while(m--)
scanf("%d%d",&x,&y),c[x].push_back(y),c[y].push_back(x),scanf("%d%d",u[x]+y,v[x]+y),v[y][x]=-v[x][y];
for(B();E(););
printf("%d",z);
}