#include<bits/stdc++.h>
using namespace std;
struct node
{
long long next,to,ww;
};
node e[3200001];
long long s,t;
long long deep[800001],head[200001],sum=1;
long long inf=1e8;
void add(int x,int y,int z)
{
sum++;
e[sum].to=y;
e[sum].next=head[x];
e[sum].ww=z;
head[x]=sum;
}
bool bfs()
{
long long i,u,v;
queue<long long>qu;
memset(deep,0,sizeof(deep));
deep[s]=1;
qu.push(s);
while(!qu.empty())
{
u=qu.front();
qu.pop();
for(i=head[u];i;i=e[i].next)
{
v=e[i].to;
if(e[i].ww>0&&!deep[v])
{
deep[v]=deep[u]+1;
qu.push(v);
}
}
}
return deep[t];
}
long long dfs(long long u,long long flow)
{
if(u==t)
{
return flow;
}
long long fl=0,i,v,c;
for(i=head[u];i&&flow;i=e[i].next)
{
v=e[i].to;
if(e[i].ww>0&&deep[v]==deep[u]+1)
{
c=dfs(v,min(flow,e[i].ww));
e[i].ww-=c;
e[i^1].ww+=c;
flow-=c;
fl+=c;
}
}
if(fl==0)
{
deep[u]=0;
}
return fl;
}
long long dinic()
{
long long maxflow=0;
while(bfs())
{
maxflow+=dfs(s,inf);
}
return maxflow;
}
int main()
{
long long n,m,i,x,y,z,ans;
scanf("%lld%lld",&n,&m);
s=1;
t=n;
for(i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z*1007+1);
add(y,x,0);
}
ans=dinic();
printf("%lld %lld\n",ans/1007,ans%1007);
return 0;
}