#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
typedef pair<int,int> pii;
const int maxn=2000000+5,maxm=100000+5;
priority_queue<pii,vector<pii>,greater<pii> >pq;
struct Edge{
ll u,v,nxt,w;
}edge[maxn],edge2[maxn];
ll ecount,ecount2,pcount;
ll head[maxm];
ll f[maxm],h[maxm];
queue<int> q;
bool vis[maxm];
int n,m;
inline ll read(){
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
//ll find(int v){
// if(f[v]==v)return v;
// return f[v]=find(f[v]);
//}
inline void add(int u,int v,int w){
ecount++;
edge[ecount].v=v;
edge[ecount].w=w;
edge[ecount].nxt=head[u];
head[u]=ecount;
}
void bfs(){
memset(vis,0,sizeof vis);
q.push(1);vis[1]=1;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head[now];i;i=edge[i].nxt){
ecount2++;
edge2[ecount2].u=now;
edge2[ecount2].v=edge[i].v;
edge2[ecount2].w=edge[i].w;
if(!vis[edge[i].v]){
pcount++;
q.push(edge[i].v);
vis[edge[i].v]=1;
}
}
}
}
ll sum;
void dijikstra(int s){
memset(f,0x3f,sizeof(f));
memset(vis,0,sizeof(vis));
f[s]=0;
pii r=make_pair(0,s);
pq.push(r);
while(!pq.empty()){
r=pq.top();
pq.pop();
if(vis[r.second])continue;
int u=r.second;
int d=r.first;
vis[u]=1;sum++;
for(int i=head[u];i;i=edge[i].nxt){
if(d+edge[i].w<f[edge[i].v]&&!vis[edge[i].v]){
f[edge[i].v]=d+edge[i].w;
pq.push(make_pair(f[edge[i].v],edge[i].v));
}
}
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
h[i]=read();
f[i]=i;
}
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
if(h[u]>h[v])add(u,v,w);
if(h[u]<h[v])add(v,u,w);
}
dijikstra(1);
bfs();
printf("%lld %lld",pcount+1,f[n]);
return 0;
}