#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+20;
const int maxn=2e6+10;
int height[maxn];
struct edge{
int next, v, w;
}E[maxm];
int p[maxn];
void init(){
for(int i=1;i<maxn;i++){
p[i]=-1;
}
}
int cnt;
struct node{
int x,y,z;
}pp[maxm];
int father[maxn];
void initd(){
for(int i=0;i<maxn;i++){
father[i]=i;
}
}
int fa(int x){
if(x==father[x]) return x;
father[x]=fa(father[x]);
return father[x];
}
int n,m;
int cntt;
int kruskal(){
int ans=0;
for(int i=1;i<=cntt;i++){
// cout<<ans<<" "<<u<<" "<<v<<endl;
int uu=fa(pp[i].x);
int vv=fa(pp[i].y);
if(uu!=vv){
father[uu]=vv;
ans+=pp[i].z;
if(--n<2) break;
}
}
return ans;
}
bool cmp1(node x,node y) {
if(height[x.y]!=height[y.y]) return height[x.y]>height[y.y];
return x.z<y.z;
}
void ae(int u,int v,int w){
E[cnt].v=v;
E[cnt].w=w;
E[cnt].next=p[u];
p[u]=cnt++;
}
bool vis[maxn];
queue<int> q;
int ans1;
void dfs(int x){
if(vis[x]) return;
vis[x]=true;
ans1++;
for(int i=p[x];i!=-1;i=E[i].next){
pp[cntt].x=x;
pp[cntt].y=E[i].v;
pp[cntt].z=E[i].w;
cntt++;
if(!vis[E[i].v]) dfs(E[i].v);
}
}
signed main(){
init();
initd();
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>height[i];
for(int i=1;i<=m;i++){
int uu,vv,kk;
cin>>uu>>vv>>kk;
if(height[uu]>=height[vv]) ae(uu,vv,kk);
if(height[vv]>=height[uu]) ae(vv,uu,kk);
}
dfs(1);
cout<<ans1<<" ";
sort(pp+1,pp+cntt+1,cmp1);
cout<<kruskal();
}
马蜂正常,谢谢各位啦