#include <bits/stdc++.h>
using namespace std;
const int maxm=5e4+10;
const int maxn=5e3+10;
const int inf = 0x3f3f3f3f;
struct edge{
int v,next;
int c,w;
}e[maxm<<1];
int head[maxn],cnt=0;
int dis[maxn];
int n,m,s,t;
bool vis[maxn];
int mincost = 0;
void add(int u,int v,int c,int w){
e[cnt].v=v;
e[cnt].c=c;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt++;
}
void init(){
memset(head,-1,sizeof(head));
cnt=0;
}
bool spfa(int s,int t){
for (int i=0;i<maxn;i++) dis[i] = inf;
memset(vis,0,sizeof(vis));
dis[s] = 0;
vis[s] = 1;
deque<int> dq;
dq.push_front(s);
while(!dq.empty()){
int u=dq.front();
dq.pop_front();
vis[u] = 0;
for (int i=head[u];~i;i=e[i].next){
int v=e[i].v;
int c=e[i].c;
int w=e[i].w;
if(c>0 && dis[v] > dis[u] + w){
dis[v]=dis[u]+w;
if(!vis[v]){
if(!dq.empty() && dis[dq.front()]>dis[v]){
dq.push_front(v);
}
else dq.push_back(v);
}
}
}
}
return dis[t]!=inf;
}
int dfs(int u,int flow){
if(u == t) return flow;
int delta = flow;
vis[u] = true;
for (int i=head[u];~i;i=e[i].next){
int v=e[i].v,c=e[i].c,w=e[i].w;
if(c>0 && !vis[v] && dis[v] == dis[u] + w){
int d=dfs(v,min(c,delta));
e[i].c-=d;
e[i^1].c+=d;
delta-=d;
mincost+=w*d;
if(delta == 0) break;
}
}
vis[u] = false;
return flow-delta;
}
void dinic(int s){
int maxflow = 0;
while(spfa(s,t)){
memset(vis,0,sizeof(vis));
maxflow+=dfs(s,inf);
}
printf("%d %d\n",maxflow,mincost);
}
int main(){
init();
scanf("%d%d%d%d",&n,&m,&s,&t);
for (int i=1;i<=m;i++){
int u,v,c,w;
scanf("%d%d%d%d",&u,&v,&c,&w);
add(u,v,c,w);
add(v,u,0,-w);
}
dinic(s);
return 0;
}