#include <cstdio>
#include <vector>
#include <cstdlib>
#include <queue>
#include <algorithm>
#define pb push_back
#define mp make_pair
using namespace std;
const int nmax=355,INF=100000000,DIM=50000;
char buff[DIM];
int poz=DIM-1;
void citeste(int &nr)
{
nr=0;
int semn=0;
while(!('0'<=buff[poz]&&buff[poz]<='9'))
{
if(buff[poz]=='-') semn=1;
if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
}
while(('0'<=buff[poz]&&buff[poz]<='9'))
{
nr=nr*10 + buff[poz]-'0';
if(buff[poz]=='-') semn=1;
if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
}
if(semn) nr=-nr;
}
int f[nmax][nmax],c[nmax][nmax],d[nmax][nmax],t[nmax],dist[nmax],vis[nmax],upd[nmax];
queue<int>q;
vector<int>adj[nmax];
int n,m,s,dest;
inline void citire()
{
citeste(n),citeste(m),citeste(s),citeste(dest);
// printf("%d %d %d %d\n",n,m,s,dest);
for(;m>0;--m)
{
int x,y,ct,z;
citeste(x),citeste(y),citeste(ct),citeste(z);
// printf("%d %d %d %d\n",x,y,ct,z);
adj[x].pb(y);
adj[y].pb(x);
c[x][y]+=ct;
d[x][y]+=z;
d[y][x]-=z;
}
for(int i=1;i<=n;i++) random_shuffle(adj[i].begin(),adj[i].end());
}
int bellman()
{
for(int i=1;i<=n;i++)
{
dist[i]=INF;
upd[i]=0;
vis[i]=0;
t[i]=0;
}
q.push(s);
vis[s]=1;
dist[s]=0;
while(!q.empty())
{
int nod=q.front();
q.pop();
vis[nod]=0;
for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();++it)
{
if(c[nod][*it]-f[nod][*it]<=0) continue;
if(dist[*it]>dist[nod]+d[nod][*it])
{
dist[*it]=dist[nod]+d[nod][*it];
t[*it]=nod;
if(!vis[*it])
{
vis[*it]=1;
q.push(*it);
}
}
}
}
if(dist[dest]==INF) return 0;
return 1;
}
inline void do_flow()
{
int flow=0,cost=0;
for(int fmin=INF;bellman();)
{
int sumt=0;
for(int nod=dest;nod!=s;nod=t[nod])
{
sumt+=d[t[nod]][nod];
fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
}
cost+=dist[dest]*fmin;
flow+=fmin;
for(int nod=dest;nod!=s;nod=t[nod])
{
f[t[nod]][nod]+=fmin;
f[nod][t[nod]]-=fmin;
}
}
printf("%d\n",cost);
}
int main()
{
freopen ("fmcm.in","r",stdin);
freopen ("fmcm.out","w",stdout);
citire();
do_flow();
}