#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int M=1e6+10; int r,x,y,m,n,now; int f[M],h[M]; bool vis[M]; LL ans; int num; struct node{ int u,v; LL w; }s[M<<1],c[M<<1]; int cnt,head[M<<1]; struct edge{ int to,nxt; }e[M<<1]; int Find(int x){ return f[x]==x?x:f[x]=Find(f[x]); } inline void Add(int x,int y){ cnt++; e[cnt].to=y; e[cnt].nxt=head[x]; head[x]=cnt; } inline void Insert(int x,int y,int z){ num++; c[num].u=x; c[num].v=y; c[num].w=z; } void DFS(int x){ vis[x]=true; r++; for(int i=head[x];i;i=e[i].nxt){ int v=e[i].to; if(!vis[v]) DFS(v); } } inline bool CMP(node a,node b){ return h[a.v]==h[b.v]?a.w<b.w:h[a.v]>h[b.v]; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&h[i]); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); if(h[x]>=h[y]) Add(x,y); if(h[x]<=h[y]) Add(y,x); s[i].u=x; s[i].v=y; scanf("%lld",&s[i].w); } DFS(1); for(int i=1;i<=m;i++) if(vis[s[i].u]&&vis[s[i].v]){ x=s[i].u; y=s[i].v; if(h[x]>=h[y]) Insert(x,y,s[i].w); if(h[x]<=h[y]) Insert(y,x,s[i].w); } sort(c+1,c+num+1,CMP); for(int i=1;i<=n;i++) f[i]=i; printf("%d ",r); for(int i=1;i<=num;i++){ 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\n",ans); return 0; }