#include<bits/stdc++.h>
#define N 2023333
#define rep(i,l,r) for(int i=l;i<=r;i++)
using namespace std;
typedef long long ll;
struct zs{
int u,v;
ll w;
}s[N],c[N];
struct Edge{
int to,next;
}e[N];
ll ans;
int r,x,y,f[N],tot,cnt,head[N],m,n,now;
int h[N];
int find(int x) {
if(f[x]==x) return x;else return f[x]=find(f[x]);
}
bool vis[N];
void ins(int u,int v) {
e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
}
void dfs(int x) {
vis[x]=1; ++r;
for(int k=head[x];k;k=e[k].next) if(!vis[e[k].to]) dfs(e[k].to);
}
bool cmp(zs a,zs b) {
if(h[a.v]==h[b.v]) return a.w<b.w;else return h[a.v]>h[b.v];
}
int main () {
scanf("%d%d",&n,&m);
rep(i,1,n) scanf("%d",&h[i]);
rep(i,1,m) {
scanf("%d%d",&x,&y);
if(h[x]>=h[y]) ins(x,y);
if(h[x]<=h[y]) ins(y,x);
s[i].u=x; s[i].v=y; scanf("%lld",&s[i].w);
}
dfs(1);
rep(i,1,m) if(vis[s[i].u] && vis[s[i].v]){
x=s[i].u; y=s[i].v;
if(h[x]>=h[y]) c[++cnt].u=x,c[cnt].v=y,c[cnt].w=s[i].w;
if(h[x]<=h[y]) c[++cnt].u=y,c[cnt].v=x,c[cnt].w=s[i].w;
}
sort(c+1,c+1+cnt,cmp);
rep(i,1,n) f[i]=i;
printf("%d ",r);
rep(i,1,cnt) {
x=find(c[i].u); y=find(c[i].v);
if(x!=y) {
f[x]=y;
++now;
ans+=(ll)c[i].w;
}
if(now+1==r) break;
}
printf("%lld",ans);
}