#include <iostream>
#include <bits/stdc++.h>
typedef long long ll; 

using namespace std;
int n;
vector<vector<int>>adj;
int id = 1;
int scc = 0;
vector<int>node_id;
vector<bool>instack;
stack<int>stk;
vector<bool>vis;
vector<int>low_link;
vector<int>kindom;

void dfs(int node){
	vis[node] = 1;
	instack[node] = 1;
	stk.push(node);
	node_id[node] = id++;
	low_link[node] = node_id[node];
	
	for(auto x:adj[node]){
		if(!vis[x]) dfs(x);
		if(instack[x]) low_link[node] = min(low_link[node], low_link[x]);
	}
	if(low_link[node] == node_id[node]){
		while(!stk.empty()){
			int x = stk.top(); 
			stk.pop();
			instack[x] = 0;
			low_link[x] = low_link[node];
			kindom[x] = (scc + 1);
			if(x == node) break;
			
		}
		scc++;
	}
}
void tarjan(){
	for(int i = 1;i<=n;i++){
		if(!vis[i]) dfs(i);
	}
}

ll M = 1e9 + 7; 
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	
	cin>>n;
    vector<ll>cost(n + 1); 
    for(int i = 1; i<=n;i++) cin>>cost[i]; 
	adj.resize(n + 1);
	int m; cin>>m;
	for(int i = 0;i<m;i++){
		int u,v; cin>>u>>v; adj[u].push_back(v);
	}
	vis.resize(n + 1,0);
	low_link.resize(n + 1);
	iota(low_link.begin(), low_link.end(),0);
	instack.resize(n + 1,0);
	node_id.resize(n + 1,0);
	kindom.resize(n + 1);
	tarjan();
	vector<ll> freq(scc + 1,0ll); 
    vector<ll> mn(scc + 1, 2e9 + 1ll); 
    for(int i = 1; i <=n ; i++){
       mn[kindom[i]] = min(mn[kindom[i]], cost[i]); 
    }
    ll sum = 0ll; 
    for(int i = 1; i <= scc ; i++) sum += mn[i]; 
    for(int i = 1; i <= n; i++){
       if(cost[i] == mn[kindom[i]]) freq[kindom[i]]++; 
    }
    ll count = 1ll; 
    for(int i = 1; i <= scc; i++) 
        count = (count*freq[i])%M; 
    
	cout<<sum<<" "<<count<<'\n';
}