constint maxn=100005,maxe=2000005; int n,m,e,h[maxn],nn; structedge{ int x,y,w; booloperator<(const edge&b)const {return h[y]>h[b.y]||h[y]==h[b.y]&&w<b.w;} }a[maxe]; int tot,son[maxe],nxt[maxe],lnk[maxn]; inlinevoidadd(int x,int y){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot; } int que[maxn]; bool vis[maxn]; voidbfs(){ int hed=0,til=1; que[1]=1;vis[1]=1; while (hed!=til){ int x=que[++hed]; for (int j=lnk[x];j;j=nxt[j]) if (!vis[son[j]]) vis[que[++til]=son[j]]=1; } nn=til; } int fa[maxn]; inlineintgetfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);} intmain(){ scanf("%d%d",&n,&e); for (int i=1;i<=n;i++) scanf("%d",&h[i]); for (int i=1;i<=e;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); if (h[a[i].x]<h[a[i].y]) swap(a[i].x,a[i].y); add(a[i].x,a[i].y); if (h[a[i].x]==h[a[i].y]) add(a[i].y,a[i].x); } bfs(); sort(a+1,a+1+e); for (int i=1;i<=n;i++) fa[i]=i; ll ans=0; for (int i=1;i<=e;i++) if (vis[a[i].x]&&vis[a[i].y]) if (getfa(a[i].x)!=getfa(a[i].y)){ fa[getfa(a[i].x)]=getfa(a[i].y); ans+=a[i].w; } printf("%d %lld",nn,ans); return0; }