#include<bits/stdc++.h>
#define maxn 114524
#define maxm 119999
using namespace std;
int n,val[maxn];
struct edge{
int to,next,v,from;
}edge[maxm*2];
int head[maxn],cnt,dis[maxn],vis[maxn];
long long ans[maxn];
struct node{
int id,dis;
bool operator < (const node &ccf) const{
return ccf.dis<dis;
}
};
priority_queue<node>q;
void addedge(int from,int to,int val){
edge[++cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].v=val;
head[from]=cnt;
return;
}
signed main(){
cin>>n;
for(int i = 0;i < n;++i) cin>>val[i];
int a,b,c;
while(cin>>a>>b>>c){
addedge(a,c,val[b]);
edge[cnt].from=b;
addedge(b,c,val[a]);
edge[cnt].from=a;
}
for(int i = 0;i < n;++i)
addedge(114514,i,val[i]);
memset(dis,11451400,sizeof(dis));
dis[114514]=0;ans[114514]=1;
for(int i = 0;i < n;++i) ans[i]=1;
q.push({114514,0});
while(!q.empty()){
node res=q.top();
q.pop();
int id=res.id,dist=res.dis;
if(vis[id]) continue;
vis[id]=1;
for(int ioi=head[id];ioi;ioi=edge[ioi].next){
int to=edge[ioi].to,va=edge[ioi].v;
if(dis[to]>dist+va){
dis[to]=dist+va;
ans[to]=ans[id]*ans[edge[ioi].from];
if(!vis[to])
q.push({to,dis[to]});
}
else if(dis[to]==dist+va){
ans[to]+=ans[id]*ans[edge[ioi].from];
}
}
}
cout<<dis[0]<<' '<<ans[0]/2;
return 0;
}