#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt,g[100005],h[100005],vis[100005],ans1;
long long ans2;
struct Edge
{
int from,to;
long long val;
} edge[1000005];
vector<pair<int,long long>> too[100005];
bool cmp(Edge x,Edge y)
{
return (h[x.to]==h[y.to]?x.val<y.val:h[x.to]>h[y.to]);
}
int dfn(int x)
{
return (x==g[x]?x:g[x]=dfn(g[x]));
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
g[i]=i;
cin>>h[i];
}
for(int i=1;i<=m;i++)
{
int u,v;
long long w;
cin>>u>>v>>w;
if(h[u]>=h[v])
{
too[u].emplace_back(make_pair(v,w));
}
if(h[v]>=h[u])
{
too[v].emplace_back(make_pair(u,w));
}
}
queue<int> q;
q.emplace(1);
while(q.size())
{
int now=q.front();
q.pop();
for(pair<int,int> to:too[now])
{
edge[++cnt].from=now,edge[cnt].to=to.first;
edge[cnt].val=to.second;
if(!vis[to.first])
{
ans1++;
vis[to.first]=1;
q.emplace(to.first);
}
}
}
sort(edge+1,edge+cnt+1,cmp);
for(int i=1;i<=cnt;i++)
{
if(dfn(edge[i].from)==dfn(edge[i].to))
{
continue;
}
g[dfn(edge[i].from)]=edge[i].to;
ans2+=edge[i].val;
}
cout<<ans1+1<<" "<<ans2;
}