#include <bits/stdc++.h>
using namespace std;
struct node{
int head,to,from;
}edge[10000005];
int h[1005],cnt;
bool v[1005];
long long num[1005];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
int dis[1005];
void add(int x,int y,int z){
cnt++;
edge[cnt].head = h[x];
edge[cnt].to = y;
edge[cnt].from = z;
h[x] = cnt;
}
void dijkstra(){
while(q.size()){
int x = q.top().second;
q.pop();
if(v[x])continue;
v[x] = 1;
for(int i = h[x];i;i = edge[i].head){
int y = edge[i].to,z = edge[i].from;
if(dis[y] > dis[x] + dis[z]){
dis[y] = dis[x] + dis[z];
num[y] = num[x] * num[z];
q.push(make_pair(dis[y],y));
}else if(dis[y] == dis[x] + dis[z]){
num[y] += num[x] * num[z];
}
}
}
}
int main(){
int n;
cin >> n;
for(int i = 0;i < n;i++){
cin >> dis[i];
num[i] = 1;
q.push(make_pair(dis[i],i));
}
int a,b,c;
while(cin >> a){
cin >> b >> c;
add(a,c,b);
}
dijkstra();
cout << dis[0] << " " << num[0];
return 0;
}