#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e3+10,M=5e4+10,inf=4e18;
int n,m,s,t,tot=1,head[N],now[N],vis[N];ll ans1,ans2,dis[N];queue<int>q;
struct edge{int to,nxt;ll w,c;}e[M<<1];
void add(int u,int v,int w,int c){e[++tot]={v,head[u],w,c},head[u]=tot;}
bool bfs(int s,int t){
for(int i=1;i<=n;i++)dis[i]=inf;while(!q.empty())q.pop();
q.push(s),dis[s]=0,now[s]=head[s];
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(e[i].w&&dis[y]>dis[x]+e[i].c){
q.push(y),dis[y]=dis[x]+e[i].c,now[y]=head[y];
if(y==t)return 1;
}
}
}return 0;
}ll dfs(int x,ll sum){
if(x==t)return sum;
ll k,ret=0;vis[x]=1;
for(int i=now[x];i&∑i=e[i].nxt){
now[x]=i;int y=e[i].to;
if(e[i].w&&dis[y]==dis[x]+e[i].c&&!vis[y]){
k=dfs(y,min(sum-ret,e[i].w));
if(k){
e[i].w-=k,e[i^1].w+=k,ret+=k,ans2+=k*e[i].c;
if(ret==k)return vis[x]=0,ret;
}
}
}return vis[x]=(ret?0:1),ret;
}int main(){
cin>>n>>m>>s>>t;
for(int i=1,u,v,w,c;i<=m;i++)cin>>u>>v>>w>>c,add(u,v,w,c),add(v,u,0,-c);
while(bfs(s,t))ans1+=dfs(s,inf);
cout<<ans1<<' '<<ans2;
return 0;
}