88分最后一个点过不去
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int MAXN=2e6+10;
const LL inf=1e15;
int n,m,S,T;
struct daduoli {
int f,t;
LL c;
}que[MAXN*2];
int cnt=1,h[MAXN];
void add(int f,int t,LL c) {
que[++cnt].f=h[f];
que[cnt].t=t;
que[cnt].c=c;
h[f]=cnt;
}
void adline(int f,int t,LL c) {
add(f,t,c);
add(t,f,0);
}
int cur[MAXN],dis[MAXN];
bool bfs() {
for(int i=1;i<=T;++i) {
cur[i]=h[i];
dis[i]=-2;
}
queue<int> q;
q.push(S);
dis[S]=1;
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=h[u];i;i=que[i].f) {
int t=que[i].t;
if(que[i].c&&dis[t]==-2) {
dis[t]=dis[u]+1;
if(t==T) return 1;
q.push(t);
}
}
}
return 0;
}
LL dinic(int node,LL flow) {
if(node==T) return flow;
LL res=0,k=0;
for(int i=cur[node];i&&flow;i=que[i].f) {
int t=que[i].t;
cur[node]=i;
if(dis[node]+1!=dis[t]||!que[i].c) continue;
k=dinic(t,min(flow,que[i].c));
if(!k) dis[t]=-2;
res+=k;
flow-=k;
que[i].c-=k;
que[(i^1)].c+=k;
}
return res;
}
int p[MAXN];
struct ddl {
int f,t,c;
}a[MAXN];
signed main () {
scanf("%d%d",&n,&m);
S=1;
T=n;
for(int i=1;i<=m;++i) {
scanf("%d%d%d",&a[i].f,&a[i].t,&a[i].c);
p[i]=cnt+1;
adline(a[i].f,a[i].t,a[i].c);
}
int ans=0;
while(bfs()) ans+=dinic(S,inf);
cout<<ans<<' ';
for(int i=1;i<=100000;++i) h[i]=0;
memset(que,0,sizeof(que));
for(int i=1;i<=m;++i) {
if(!que[p[i]].c) {
adline(a[i].f,a[i].t,1);
}
else adline(a[i].f,a[i].t,inf);
}
ans=0;
while(bfs()) ans+=dinic(S,inf);
cout<<ans;
return 0;
}