#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=15114<<1,inf=0x3f3f3f3f3f3f3f3f;
int val[maxn],c[maxn],dist[maxn],visit[maxn],head[maxn],to[maxn],nxt[maxn];
int n,m,s,t,cst=0,ans=0;
int cnt=1;
queue < int > q;
void add1(int u,int v,int w,int cost){
nxt[++cnt]=head[u];
to[cnt]=v;
val[cnt]=w;
c[cnt]=cost;
head[u]=cnt;
}
void add2(int u,int v,int w,int cost){
add1(u,v,w,cost);
add1(v,u,0,-cost);
}
bool spfa(){
memset(dist,inf,sizeof(dist));
q.emplace(s);
dist[s]=0;
visit[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
visit[u]=0;
for(int i=head[u];i;i=nxt[i]){
if(val[i]&&dist[to[i]]>dist[u]+c[i]){
dist[to[i]]=dist[u]+c[i];
if(!visit[to[i]]){
visit[to[i]]=1;
q.emplace(to[i]);
}
}
}
}
return dist[t]!=inf;
}
int dfs(int u,int sum){
if(u==t)return sum;
visit[u]=1;
int now=sum;
for(int i=head[u];i&&now;i=nxt[i]){
if(!visit[to[i]]&&val[i]&&dist[to[i]]==dist[u]+c[i]){
int fa=dfs(to[i],min(now,val[i]));
if(!fa)dist[to[i]]=inf;
else{
now-=fa;
val[i]-=fa;
val[i^1]+=fa;
cst+=fa*c[i];
}
}
}
visit[u]=0;
return sum-now;
}
int dinic(){
while(spfa()){
ans+=dfs(s,inf);
}
return cst;
}
signed main(){
ios::sync_with_stdio(false);
memset(dist,inf,sizeof(dist));
cin>>n>>m;
s=1,t=n;
for(int i=1;i<=m;i++){
int u,v,w,x;
cin>>u>>v>>w>>x;
add2(u,v,w,x);
}
cout<<ans<<" "<<dinic();
return 0;
}