#include<bits/stdc++.h>
#define maxn 1005
#define maxm 10000005
#define ll long long
using namespace std;
int n;
ll a[maxn];
ll dis[maxn],c[maxn];
ll bj[maxn];
int head[maxn],to[maxm],nex[maxm],to1[maxn],n1;
void add(int u,int v,int w) {
to[++n1]=v;
nex[n1]=head[u];
to1[n1]=w;
head[u]=n1;
}
priority_queue<pair<ll,int> > q;
void dij() {
for(int i=0;i<n;i++) {
dis[i]=a[i];
bj[i]=1;
c[i]=0;
}
for(int i=0;i<n;i++) {
q.push(make_pair(-dis[i],i));
}
while(!q.empty()) {
int len=-q.top().first,now=q.top().second;
q.pop();
if(len!=dis[now]) continue;
c[now]=1;
for(int i=head[now];i;i=nex[i]) {
int st=to[i],st1=to1[i];
if(c[st]) {
if(dis[now]+dis[st]<dis[st1]) {
dis[st1]=dis[now]+dis[st];
bj[st1]=bj[now]*bj[st];
q.push(make_pair(-dis[st1],st1));
}
else if(dis[now]+dis[st]==dis[st1]) bj[st1]+=bj[now]*bj[st];
}
}
}
printf("%lld %lld\n",dis[0],bj[0]);
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%lld",&a[i]);
}
int u1,u2,v;
while(scanf("%d%d%d",&u1,&u2,&v)!=EOF){
add(u1,u2,v);
if(u1==u2)continue;
add(u2,u1,v);
}
dij();
return 0;
}