//话说为什么是vis[j]????难道我dijkstra没学好??
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
int n,vis[maxn],ans[maxn],dis[maxn],a[maxn],
nxt[maxn],cnt,head[maxn],d[maxn][maxn],v[maxn];
/*void add(int x,int y,int z){
++cnt; v[cnt]=y; w[cnt]=z; nxt[cnt]=head[x];
head[x]=cnt;
} */
int main(){
memset(head,-1,sizeof(head));
memset(d,-1,sizeof(d));
scanf("%d",&n);
for(int i=0;i<n;i++) dis[i]=100000000;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
dis[i]=a[i];
ans[i]=1;
}
int x,y,z;
while(scanf("%d%d%d",&x,&y,&z)!=EOF){
d[x][y]=z; d[y][x]=z;
}
for(int i=0;i<n-1;i++){
int maxx=100000000,num;
for(int j=0;j<n;j++){
if(!vis[j]&&dis[j]<maxx){
maxx=dis[j],num=j;
}
}
vis[num]=true;
for(int j=0;j<n;j++){
if(vis[j]&&d[num][j]!=-1){
if(dis[d[num][j]]>dis[num]+dis[j]){
dis[d[num][j]]=dis[num]+dis[j];
ans[d[num][j]]=ans[num]*ans[j];
}
else{
if(dis[d[num][j]]==dis[num]+dis[j]){
ans[d[num][j]]+=ans[num]*ans[j];
}
}
}
}
}
cout<<dis[0]<<' '<<ans[0]<<endl;
return 0;
}