#include <bits/stdc++.h>
using namespace std;
const int maxn=100005,mod=1000000007;
int n,m;
vector<int> e[maxn];
int cost[maxn],vis[maxn],mins[maxn],cnts[maxn];
int dfn[maxn],low[maxn],st[maxn],scc[maxn],ins[maxn];
int num,cnt,top;
void tarjan(int u)
{
dfn[u]=low[u]=++num;
st[++top]=u;
ins[u]=1;
for(int i=0;i<=e[u].size()-1;i++)
{
int v=e[u][i];
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])
{
cnt++;
int v;
do{
v=st[top--];
ins[v]=0;
scc[v]=cnt;
}while(u!=v&&top>=0);
}
}
int main()
{
int u,v;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&cost[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&u,&v);
e[u].push_back(v);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i]) tarjan(i);
}
memset(mins,0x3f,sizeof(mins));
for(int i=1;i<=n;i++)
{
if(cost[i]<mins[scc[i]])
{
mins[scc[i]]=cost[i];
cnts[scc[i]]=1;
}
else if(mins[scc[i]]==cost[i])
{
cnts[scc[i]]++;
}
}
long long ans=0,amount=1;
for(int i=1;i<=cnt;i++)
{
ans+=mins[i];
amount=amount*cnts[i]%mod;
}
printf("%lld %lld\n",ans,amount);
return 0;
}