#include <bits/stdc++.h>
using namespace std;
ifstream in ("fmcm.in");
ofstream out ("fmcm.out");
const int N=350;
const int INF=1000000000;
vector<int>ed[N+1];
int r[N+3][N+3],dist[N+3],cost[N+3][N+3],init_dist[N+3],init_cost[N+3][N+3],inQ[N+3],prv[N+3];
void bellman (int S)
{
queue<int>q;
q.push(S);
for(int i=1;i<=N;++i)
init_dist[i]=INF;
init_dist[S]=0;
inQ[S]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
inQ[nod]=0;
for(int nn : ed[nod])
{
if(!r[nod][nn])
continue;
if(init_dist[nod]+init_cost[nod][nn]<init_dist[nn])
{
init_dist[nn]=init_dist[nod]+init_cost[nod][nn];
if(!inQ[nn])
{
inQ[nn]=1;
q.push(nn);
}
}
}
}
for(int i=1;i<=N;++i)
for(int nn : ed[i])
cost[i][nn]=init_cost[i][nn] + init_dist[i] - init_dist[nn];
}
pair<int,int> dijkstra (int S, int D)
{
priority_queue<pair<int,int> >q;
for(int i=1;i<=N;++i)
dist[i]=INF;
dist[S]=0;
q.push(make_pair(0,S));
while(!q.empty())
{
int nod=q.top().second,distc=-q.top().first;
q.pop();
if(dist[nod]<distc)
continue;
for(int nn : ed[nod])
{
if(!r[nod][nn])
continue;
if(dist[nod]+cost[nod][nn] < dist[nn])
{
dist[nn] = dist[nod]+cost[nod][nn];
prv[nn]=nod;
q.push(make_pair(-dist[nn],nn));
}
}
}
if(dist[D]==INF)
return make_pair(0,0);
int mn=INF,cst=0,pz=D;
while(pz!=S)
{
mn=min(mn,r[prv[pz]][pz]);
cst+=cost[prv[pz]][pz];
pz=prv[pz];
}
pz=D;
cst=mn*(cst+init_dist[D]);
while(pz!=S)
{
r[prv[pz]][pz]-=mn;
r[pz][prv[pz]]+=mn;
pz=prv[pz];
}
return make_pair(mn,cst);
}
pair<int,int> mcmf (int S, int D)
{
bellman(S);
int F=0,C=0;
pair<int,int>a=dijkstra(S,D);
while(a!=make_pair(0,0))
{
F+=a.first;
C+=a.second;
a=dijkstra(S,D);
}
return make_pair(F,C);
}
void add_edge(int x, int y, int cap, int cst)
{
r[x][y]+=cap;
init_cost[x][y]+=cst;
init_cost[y][x]-=cst;
ed[x].push_back(y);
ed[y].push_back(x);
}
int main()
{
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
long long t,i,k,s,d,m,j=0,tt,p,n,K;
in>>n>>m>>s>>d;
while(m--)
{
int x,y,c,z;
in>>x>>y>>c>>z;
add_edge(x,y,c,z);
}
pair<int,int>a=mcmf(s,d);
out<<a.second;
return 0;
}