#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
#define N 512
#define inf 0x7fffffff
int n,m,x,y,ca,c;
struct maxFlowMinCost{
int cap[N][N],cost[N][N];
int pre[N],dis[N];
int n,m,ans,s,t;
queue<int>q;
bool inQue[N];
void input(){
cin>>n>>m;
memset(cost,0x7f,sizeof(cost));
for(int i=1;i<=n;i++)cost[i][i]=0;
for(int i=1;i<=m;i++){
cin>>x>>y>>ca>>c;
cap[x][y]=ca;
cost[x][y]=c;
}
s=1,t=n;
}
bool spfa(){
memset(pre,-1,sizeof(pre));
memset(inQue,0,sizeof(inQue));
fill(dis,dis+N,inf);
dis[s]=0;
q.push(s);
while(!q.empty()){
int v=q.front();
q.pop();
inQue[v]=0;
for(int i=1;i<=n;i++){
if(cap[v][i]>0&&dis[i]>dis[v]+cost[v][i]){
if(!inQue[i]){
q.push(i);
inQue[i]=1;
}
dis[i]=dis[v]+cost[v][i];
pre[i]=v;
}
}
}
return dis[t]^inf;
}
int excute(){
input();
int minCost=0,maxFlow=0;
while(spfa()){
int neck=inf;
for(int i=t;i!=s;i=pre[i])
neck=min(neck,cap[pre[i]][i]);
maxFlow+=neck;
for(int i=t;i!=s;i=pre[i]){
cap[pre[i]][i]-=neck;
cap[i][pre[i]]+=neck;
cost[i][pre[i]]=-cost[pre[i]][i];
minCost+=cost[pre[i]][i]*neck;
}
}
return minCost;
}
}mcmf;
int main(){
cout<<mcmf.excute();
}