#include<bits/stdc++.h>
using namespace std;
const int N=1e4,M=1e5+10;
struct edge{
int s,t,num;
long long val;
}e[M];
int f[N][N],mp[N][N];
int dep[N];
int s,t,n,m;
vector<int> g[N];
queue<int> q;
bool cmp(edge satori,edge koishi){
if(satori.val==koishi.val)
return satori.num<koishi.num;
else return satori.val>koishi.val;
}
bool bfs(){
while(!q.empty())q.pop();
memset(dep,0,sizeof(dep));
q.push(s);
dep[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(!dep[v] && f[u][v]){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int maxflow){
if(u==t)return maxflow;
if(maxflow==0)return 0;
int v;
int flow;
for(int i=0;i<g[u].size();i++){
if(dep[v=g[u][i]]!=dep[u]+1)continue;
if((flow=dfs(v,min(maxflow,f[u][v]))))
{
f[u][v]-=flow;
f[v][u]+=flow;
return flow;
}
}
return 0;
}
int dinic(){
int res=0,tmp;
while(bfs())
while(tmp=dfs(s,1e9))
res+=tmp;
return res;
}
void reset(){
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
f[i][j]=mp[i][j];
}
int main(){
s=1;
cin>>n;
t=n;
cin>>m;
for(int i=1;i<=m;i++){
cin>>e[i].s>>e[i].t>>e[i].val;
e[i].num=i;
mp[e[i].s][e[i].t]+=e[i].val;
f[e[i].s][e[i].t]+=e[i].val;
g[e[i].s].push_back(e[i].t);
}
sort(e+1,e+m+1,cmp);
int nans=dinic(),tmpans,ans=0;
cout<<nans<<" ";
for(int i=1;i<=m;i++){
reset();
f[e[i].s][e[i].t]-=e[i].val;
tmpans=dinic();
if(nans-tmpans==e[i].val){
ans++;
mp[e[i].s][e[i].t]-=e[i].val;
nans=tmpans;
}
}
cout<<ans;
return 0;
}