rt
/*****************************************
Note :
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
#define LL long long
#define IL inline
const int N = 2e6+10;
const int INF = 0x3f3f3f3f;
using namespace std;
IL int read()
{
char ch = getchar();
int f = 1, num = 0;
while(ch>'9'||ch<'0')
{
if(ch=='-') f = -1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
num = num*10+ch-'0', ch = getchar();
return num*f;
}
int tot,n,m,h[N],vis[N],cnt,ans,fa[N],sum;
int head[N],ne[N],w[N],to[N],id;
void add(int x,int y,int z)
{
to[++id]=y,w[id]=z,ne[id]=head[x],head[x]=id;
}
struct node
{
int u,v,w;
}p[N];
void bfs(int u)
{
queue<int> q;
q.push(u),vis[u]=1;
while(!q.empty())
{
int t=q.front();
sum++;
q.pop();
for(int i = head[t];i;i=ne[i])
{
int v=to[i];
p[++cnt]=(node){t,v,w[i]};
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
bool cmp(node a,node b)
{
if(h[a.u]==h[a.v])
return a.w<b.w;
return h[a.u]>h[a.v];
}
int f(int x)
{
if(fa[x]==x) return x;
return fa[x]=f(fa[x]);
}
int main()
{
n=read(),m=read();
for(int i = 1;i<=n;i++)
h[i]=read(),fa[i]=i;
for(int i = 1,x,y,z;i<=m;i++)
{
x=read(),y=read(),z=read();
if(h[x]>=h[y])
add(x,y,z);
if(h[y]>=h[x])
add(y,x,z);
}
bfs(1);
sort(p+1,p+1+cnt,cmp);
for(int i = 1;i<=cnt;i++)
{
int uu=f(p[i].u),vv=f(p[i].v);
if(uu!=vv)
{
fa[uu]=vv;
ans+=p[i].w;
}
}
printf("%d %d\n",sum,ans);
}