#include <bits/stdc++.h>
#define maxe 500050
#define maxv 500050
using namespace std;
vector<int> G[maxe];
const int mod = 1e9 + 7;
const int inf = 1e9 + 1;
int n, m;
int cnts = 1;
int low[maxv];
int dfn[maxv];
int belong[maxv];
int s[maxv];
int top = 0;
int cnt = 0, tot = 0;
int num[maxv];
int outdegree[maxv];
int indegree[maxv];
bool vis[maxv];
int sum[maxv];
int w[maxv];
long long ans1,ans2;
void tarjan(int x) {
int c;
low[x] = dfn[x] = ++cnt;
s[++top] = x;
vis[x] = true;
for (int u = 0; u < G[x].size(); u++) {
c = G[x][u];
if (!dfn[c]) {
tarjan(c);
low[x] = min(low[x], low[c]);
} else if (vis[c]) {
low[x] = min(low[x], dfn[c]);
}
}
if (dfn[x] == low[x]) {
tot++;
c = -1;
sum[tot] = inf;
while (x != c) {
sum[tot] = min(sum[tot],w[s[top]]);
c = s[top--];
belong[c] = tot;
if(w[c] < sum[tot]){
sum[tot] = w[c];
num[tot] = 0;
}
if(w[c] == sum[tot]) num[tot]++;
vis[c] = false;
}
}
}
int u,v;
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> w[i];
cin >> m;
for(int i = 1; i <= m; i++){
cin >> u >> v;
G[u].push_back(v);
}
for (int i = 1; i <= n; i++) {
if (!dfn[i]) {
tarjan(i);
}
}
ans2 = 1;
for(int i = 1; i <= tot; i++){
ans1 += sum[i];
ans2 *= num[i];
ans2 %= mod;
}
cout<< ans1 << ' ' << ans2;
return 0;
}