#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
using namespace std;
struct node{
int sta;
int to;
long long int dis;
}edge[4000009];
struct ee{
long long int dis;
int last;
int to;
}e[4000009];
int sum=0;
int e_num;
int head[1000009];
void ed(int from,int to,int dis)
{
e[++e_num].last=head[from];
e[e_num].to=to;
e[e_num].dis=dis;
head[from]=e_num;
}
int bj[1000009];
int tall[1000009];
long long int ans;
int cnt;
int n,m;
int fu[1000009];
int js=1;
int cmp(node x,node y)
{
if(tall[x.to]==tall[x.to])
return x.dis<y.dis;
return tall[x.to]>tall[y.to];
}
void bfs()
{
queue<int> q;
q.push(1);
bj[1]=1;
while(!q.empty())
{
int cun=q.front();
q.pop();
for(int i=head[cun];i;i=e[i].last)
{
int gogo=e[i].to;
edge[++sum].sta=cun;
edge[sum].to=gogo;
edge[sum].dis=e[i].dis;
if(bj[gogo]==0)
{
bj[gogo]=1;
q.push(gogo);
++js;
}
}
}
}
int findd(int u)
{
int x=u;
while(x!=fu[x])
{
return fu[x]=findd(fu[x]);
}
return fu[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>tall[i];
}
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
if(tall[x]>=tall[y]) ed(x,y,z);
if(tall[x]<=tall[y]) ed(y,x,z);
}
bfs();
sort(edge+1,edge+1+sum,cmp);
for(int i=1;i<=n;i++)
{
fu[i]=i;
}
for(int i=1;i<=sum;i++)
{
int u=findd(edge[i].sta);
int v=findd(edge[i].to);
if(u==v) continue;
fu[u]=v;
ans+=edge[i].dis;
cnt++;
if(cnt==js-1)
{
break;
}
}
cout<<js<<" "<<ans<<endl;
return 0;
}