#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 300100
#define ll long long
#define clear(a) memset(a,0,sizeof a)
const ll MOD=1e9+7;
int n,m,tot,top,cnt,num;
ll ans1,ans2=1;
int first[maxn],w[maxn],dfn[maxn],low[maxn],st[maxn],id[maxn],min_val[maxn],same[maxn],ins[maxn];
struct edge{
int nextx,to;
}e[maxn<<1];
void add(int u,int v){
tot++;
e[tot].nextx=first[u];
first[u]=tot;
e[tot].to=v;
}
void tarjan(int u){
dfn[u]=low[u]=++cnt;
st[++top]=u;
ins[u]=1;
for(int i=first[u];i;i=e[i].nextx){
int v=e[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
id[u]=++num;
int minn=w[u];
while(st[top]!=u){
ins[st[top]]=0;
id[st[top]]=num;
top--;
minn=min(minn,w[st[top]]);
}
top--;
ins[u]=0;
min_val[num]=minn;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=1;i<n;i++)
if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)
if(w[i]==min_val[id[i]])
same[id[i]]++,same[id[i]]%=MOD;
for(int i=1;i<=num;i++){
ans1+=min_val[i];
ans2*=(same[i]%MOD),ans2%=MOD;
}
printf("%d %d\n",ans1,ans2);
return 0;
}