#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=5e5+10;
int n,m,num,p[N],p2[N],s[N];
int head[N*3],to[N*3],next[N*3],tot;
int dfn[N],low[N],stack[N],co[N],cnt,top;
bool vst[N];
vector<int> scc[N];
void add(int u,int v)
{
next[++tot]=head[u];
head[u]=tot;
to[tot]=v;
}
void tarjan(int u)
{
dfn[u]=low[u]=++num;
stack[++top]=u;vst[u]=1;
for(int i=head[u];i;i=next[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vst[v]) low[u]=(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
++cnt;int v;
do{
v=stack[top--];vst[v]=0;
co[v]=cnt;scc[cnt].push_back(v);
}while(u!=v);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i];
memset(p2,0x3f3f3f3f,sizeof(p2));
memset(s,1,sizeof(s));
cin>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
long long ans1=0,ans2=1;
for(int i=1;i<=cnt;i++)
{
int sum=1,o=0x3f3f3f3f;
for(int j=0;j<scc[i].size();j++)
{
if(p[scc[i][j]]==o) sum++;
if(p[scc[i][j]]<o) o=p[scc[i][j]],sum=1;
}
ans1+=o;
ans2=(ans2*sum)%1000000007;
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}