#include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<iostream> #include<algorithm> #include<queue> #include<set> #define maxint (2147483647) #define l(a) ((a)<<1) #define r(a) ((a)<<1|1) #define b(a) (2<<(a)) #define rep(i,a,b) for(int i=a;i<=(b);i++) #define Rep(e,x) for(edge*e=fir[x];e;e=e->next) #define clr(a) memset(a,0,sizeof(a)) typedef long long ll; using namespace std; int readint(){ int t=0,f=1;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ t=(t<<3)+(t<<1)+c-'0'; c=getchar(); } return t*f; } const int maxn=5009,maxm=50009; int n,m,S,T,flow,cost,d[maxn],a[maxn]; bool p[maxn]; struct edge{ int v,w,c; edge*next,*r; }e[maxm<<2],*fir[maxn],*cur[maxn],*pre[maxn],*pt=e; void add(int u,int v,int w,int c){ pt->v=v;pt->w=w;pt->c=c; pt->next=fir[u];fir[u]=pt++; } void addedge(int u,int v,int w,int c){ add(u,v,w,c);add(v,u,0,-c); fir[u]->r=fir[v];fir[v]->r=fir[u]; } bool spfa(){ queue<int>Q;Q.push(S);clr(p);p[S]=1; rep(i,1,n) d[i]=maxint;d[S]=0;clr(a);a[S]=maxint; while(!Q.empty()){ int x=Q.front();Q.pop();p[x]=0; Rep(e,x) if(e->w) if(d[e->v]>d[x]+e->c){ d[e->v]=d[x]+e->c; a[e->v]=min(a[x],e->w); pre[e->v]=e; if(!p[e->v]){ Q.push(e->v); p[e->v]=1; } } } return d[T]!=maxint; } void cal(){ while(spfa()){ flow+=a[T];cost+=a[T]*d[T]; for(edge*e=pre[T];e;e=pre[e->r->v]){ e->w-=a[T];e->r->w+=a[T]; } } } int main(){ //freopen("#intput.txt","r",stdin); //freopen("#output.txt","w",stdout); n=readint();m=readint();S=readint();T=readint(); rep(i,1,m){ int u=readint(),v=readint(),w=readint(),c=readint(); addedge(u,v,w,c); } cal(); printf("%d %d ",flow,cost); //fclose(stdin); //fclose(stdout); return 0; }