#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
#define NMax 355
using namespace std;
int d[NMax],old_d[NMax];
int real_d[NMax],N,M;
int inQ[NMax],tata[NMax],S,D;
int C[NMax][NMax],Cst[NMax][NMax];
priority_queue<pair<int,int>,
vector<pair<int,int> >,
greater<pair<int,int> > > H;
queue<int> Q;
vector<int> V[NMax];
void bellmanFord ()
{
memset(old_d,inf,sizeof(old_d));
old_d[S]=0;
Q.push(S), inQ[S]=1;
while (!Q.empty())
{
int crt=Q.front();
inQ[crt]=0, Q.pop();
vector<int>::iterator it;
for (it=V[crt].begin(); it!=V[crt].end(); ++it)
if (C[crt][*it] && old_d[*it]>old_d[crt]+Cst[crt][*it])
{
old_d[*it]=old_d[crt]+Cst[crt][*it];
if (!inQ[*it])
inQ[*it]=1, Q.push(*it);
}
}
}
int dijkstra ()
{
memset(d,inf,sizeof(d));
H=priority_queue<pair<int,int>,
vector<pair<int,int> >,
greater<pair<int,int> > >();
d[S]=0, real_d[S]=0;
H.push(make_pair(0,S));
while (!H.empty())
{
int crt=H.top().second;
H.pop();
vector<int>::iterator it;
for (it=V[crt].begin(); it!=V[crt].end(); ++it)
if (C[crt][*it])
{
int new_d=d[crt]+Cst[crt][*it]-old_d[*it]+old_d[crt];
if (new_d<d[*it])
{
d[*it]=new_d;
real_d[*it]=real_d[crt]+Cst[crt][*it];
tata[*it]=crt;
H.push(make_pair(d[*it],*it));
}
}
}
memcpy(old_d,real_d,sizeof(d));
return (d[D]!=inf);
}
int main ()
{
int minF,FCost=0,i,x,y,crt;
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&N,&M,&S,&D);
for (i=1; i<=M; i++)
{
scanf("%d%d",&x,&y);
V[x].push_back(y);
V[y].push_back(x);
scanf("%d%d",&C[x][y],&Cst[x][y]);
Cst[y][x]=-Cst[x][y];
}
bellmanFord();
while (dijkstra())
{
minF=inf;
for (crt=D; crt!=S; crt=tata[crt])
if (C[tata[crt]][crt]<minF)
minF=C[tata[crt]][crt];
FCost+=minF*real_d[D];
for (crt=D; crt!=S; crt=tata[crt])
{
C[tata[crt]][crt]-=minF;
C[crt][tata[crt]]+=minF;
}
}
printf("%d\n",FCost);
return 0;
}