#include<bits/stdc++.h>
using namespace std;
const long long maxn=6e5+34,MOD=1e9+7;
long long n,m;
struct E{
long long f,t,n;
}edge[maxn];
long long l,head[maxn],mon[maxn];
long long tme,low[maxn],dfn[maxn],vis[maxn],mion[maxn],cnt[maxn];
stack<long long> p;
long long tot,belong[maxn];
void tarjan(long long s){
low[s]=dfn[s]=++tme;
vis[s]=1;
p.push(s);
for(long long i=head[s];i;i=edge[i].n){
long long t=edge[i].t;
if(vis[t]==-1) continue;
if(vis[t]==1) low[s]=min(low[s],dfn[t]);
if(vis[t]==0){
tarjan(t);
low[s]=min(low[s],low[t]);
}
}
if(low[s]==dfn[s]){
tot++;
cnt[tot]=1;
while(1){
long long q=p.top();
p.pop();
belong[q]=tot;
vis[q]=-1;
// cnt[tot]++;
// mion[tot]=min(mion[tot],mon[q]);
if(mion[tot]>mon[q]){
mion[tot]=mon[q];
cnt[tot]=1;
}
else if(mion[tot]==mon[q]) cnt[tot]++;
if(q==s) break;
}
}
}
//void dp(long long )
void read(){
scanf("%lld",&n);
for(long long i=1;i<=n;i++) scanf("%lld",&mon[i]),mion[i]=1e9;
scanf("%lld",&m);
for(long long i=1;i<=m;i++){
long long f,t;
scanf("%lld%lld",&f,&t);
l++,edge[l]=(E){f,t,head[f]},head[f]=l;
}
for(long long i=1;i<=n;i++){
if(vis[i]==0) tarjan(i);
}
long long ans_1=0,ans_2=1;
for(long long i=1;i<=tot;i++){
ans_1+=mion[i];
ans_2*=cnt[tot];
ans_2%=MOD;
}
cout<<ans_1<<" "<<ans_2;
}
int main (){
read();
}