#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=3e5+10;
struct node{
int to,nxt,val;
}edge[N];
int head[N];
int cnt;
void add(int u,int v){
edge[++cnt]={v,head[u]};
head[u]=cnt;
}
stack<int> stk;
int dfn[N],low[N];
int qlt,qlcnt[N],qlmin[N];
int t;
bool vst[N];
int pv[N];
void dfs(int x){
dfn[x]=++t;
low[x]=dfn[x];
stk.push(x);
vst[x]=true;
for(int i=head[x];i!=-1;i=edge[i].nxt){
if(!dfn[edge[i].to]){
dfs(edge[i].to);
low[x]=min(low[x],low[edge[i].to]);
}else if(vst[x]){
low[x]=min(low[x],dfn[edge[i].to]);
}
}
if(low[x]==dfn[x]){
qlt++;
while(stk.top()!=x){
int tmp=stk.top();
stk.pop();
if(qlmin[qlt]==pv[tmp]) qlcnt[qlt]++;
if(qlmin[qlt]>pv[tmp]){
qlcnt[qlt]=1;
qlmin[qlt]=pv[tmp];
}
vst[tmp]=false;
}
if(qlmin[qlt]==pv[x]) qlcnt[qlt]++;
if(qlmin[qlt]>pv[x]){
qlcnt[qlt]=1;
qlmin[qlt]=pv[x];
}
vst[x]=false;
stk.pop();
}
}
int n,m,ans1=1,ans2=0;
signed main(){
memset(head,-1,sizeof(head));
memset(qlmin,0x7f,sizeof(qlmin));
cin>>n;
for(int i=1;i<=n;i++){
cin>>pv[i];
}
cin>>m;
while(m--){
int x,y;
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) dfs(i);
}
for(int i=1;i<=qlt;i++){
ans2+=qlmin[i];
ans1*=qlcnt[i];
ans1%=mod;
}
cout<<ans2<<" "<<ans1;
return 0;
}