#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 1000000007;
const int MX = 1000001;
// ─── Modular utilities ───────────────────────────────────────────────────
ll modExp(ll base, ll power) {
if (power == 0) return 1;
ll cur = modExp(base, power/2);
cur = (cur * cur) % MOD;
if (power & 1) cur = (cur * base) % MOD;
return cur;
}
ll inv(ll x) { return modExp(x, MOD-2); }
ll mul(ll a, ll b) { return (a * b) % MOD; }
ll add(ll a, ll b) { a += b; if (a >= MOD) a -= MOD; return a; }
ll sub(ll a, ll b) { a -= b; if (a < 0) a += MOD; return a; }
ll dvd(ll a, ll b) { return mul(a, inv(b)); }
ll ceilDiv(ll a, ll b) { return (a + b - 1) / b; }
// (optional) nCr in O(1) after a single initFacs()
ll *facs = new ll[MX];
ll *facInvs = new ll[MX];
void initFacs() {
facs[0] = 1;
facInvs[0] = 1;
for (int i = 1; i < MX; i++) {
facs[i] = facs[i-1] * i % MOD;
facInvs[i] = inv(facs[i]);
}
}
ll choose(int n, int r) {
if (r < 0 || r > n) return 0;
return facs[n] * facInvs[r] % MOD * facInvs[n-r] % MOD;
}
// ─── Tarjan’s SCC finder ──────────────────────────────────────────────────
void tarjanDFS(int u,
const vector<vector<int>>& adj,
vector<int>& disc,
vector<int>& low,
vector<bool>& onStack,
stack<int>& st,
int& timer,
vector<vector<int>>& sccs)
{
disc[u] = low[u] = timer++;
st.push(u);
onStack[u] = true;
for (int v : adj[u]) {
if (disc[v] == -1) {
tarjanDFS(v, adj, disc, low, onStack, st, timer, sccs);
low[u] = min(low[u], low[v]);
}
else if (onStack[v]) {
low[u] = min(low[u], disc[v]);
}
}
if (low[u] == disc[u]) {
vector<int> comp;
while (true) {
int v = st.top(); st.pop();
onStack[v] = false;
comp.push_back(v);
if (v == u) break;
}
sccs.push_back(comp);
}
}
vector<vector<int>> tarjanSCC(int n, const vector<vector<int>>& adj) {
vector<int> disc(n, -1), low(n, 0);
vector<bool> onStack(n, false);
stack<int> st;
vector<vector<int>> sccs;
int timer = 0;
for (int i = 0; i < n; i++) {
if (disc[i] == -1)
tarjanDFS(i, adj, disc, low, onStack, st, timer, sccs);
}
return sccs;
}
// ─── main() ───────────────────────────────────────────────────────────────
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
// If you ever need nCr:
// initFacs();
int n, m;
cin >> n >> m;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
vector<vector<int>> adj(n);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
u --; v --;
adj[u].push_back(v);
}
auto sccs = tarjanSCC(n, adj);
ll res1 = 0;
ll res2 = 1;
for (auto &comp : sccs) {
int currMin = INT_MAX;
int cnt = 0;
// find the minimum arr[value] in this SCC and count how many times it appears
for (int node : comp) {
if (arr[node] < currMin) {
currMin = arr[node];
cnt = 1;
} else if (arr[node] == currMin) {
cnt++;
}
}
res1 = add(res1, currMin);
res2 = mul(res2, cnt);
}
cout << res1 << ' ' << res2 << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKY29uc3QgaW50IE1PRCA9IDEwMDAwMDAwMDc7IApjb25zdCBpbnQgTVggID0gMTAwMDAwMTsKCi8vIOKUgOKUgOKUgCBNb2R1bGFyIHV0aWxpdGllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmxsIG1vZEV4cChsbCBiYXNlLCBsbCBwb3dlcikgewogICAgaWYgKHBvd2VyID09IDApIHJldHVybiAxOwogICAgbGwgY3VyID0gbW9kRXhwKGJhc2UsIHBvd2VyLzIpOwogICAgY3VyID0gKGN1ciAqIGN1cikgJSBNT0Q7CiAgICBpZiAocG93ZXIgJiAxKSBjdXIgPSAoY3VyICogYmFzZSkgJSBNT0Q7CiAgICByZXR1cm4gY3VyOwp9CgpsbCBpbnYobGwgeCkgeyByZXR1cm4gbW9kRXhwKHgsIE1PRC0yKTsgfQpsbCBtdWwobGwgYSwgbGwgYikgeyByZXR1cm4gKGEgKiBiKSAlIE1PRDsgfQpsbCBhZGQobGwgYSwgbGwgYikgeyBhICs9IGI7IGlmIChhID49IE1PRCkgYSAtPSBNT0Q7IHJldHVybiBhOyB9CmxsIHN1YihsbCBhLCBsbCBiKSB7IGEgLT0gYjsgaWYgKGEgPCAgMCkgYSArPSBNT0Q7IHJldHVybiBhOyB9CmxsIGR2ZChsbCBhLCBsbCBiKSB7IHJldHVybiBtdWwoYSwgaW52KGIpKTsgfQpsbCBjZWlsRGl2KGxsIGEsIGxsIGIpIHsgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsgfQoKLy8gKG9wdGlvbmFsKSBuQ3IgaW4gTygxKSBhZnRlciBhIHNpbmdsZSBpbml0RmFjcygpCmxsICpmYWNzICAgID0gbmV3IGxsW01YXTsKbGwgKmZhY0ludnMgPSBuZXcgbGxbTVhdOwoKdm9pZCBpbml0RmFjcygpIHsKICAgIGZhY3NbMF0gICAgPSAxOwogICAgZmFjSW52c1swXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IE1YOyBpKyspIHsKICAgICAgICBmYWNzW2ldICAgID0gZmFjc1tpLTFdICogaSAlIE1PRDsKICAgICAgICBmYWNJbnZzW2ldID0gaW52KGZhY3NbaV0pOwogICAgfQp9CgpsbCBjaG9vc2UoaW50IG4sIGludCByKSB7CiAgICBpZiAociA8IDAgfHwgciA+IG4pIHJldHVybiAwOwogICAgcmV0dXJuIGZhY3Nbbl0gKiBmYWNJbnZzW3JdICUgTU9EICogZmFjSW52c1tuLXJdICUgTU9EOwp9CgovLyDilIDilIDilIAgVGFyamFu4oCZcyBTQ0MgZmluZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKdm9pZCB0YXJqYW5ERlMoaW50IHUsCiAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIGFkaiwKICAgICAgICAgICAgICAgdmVjdG9yPGludD4mIGRpc2MsCiAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+JiBsb3csCiAgICAgICAgICAgICAgIHZlY3Rvcjxib29sPiYgb25TdGFjaywKICAgICAgICAgICAgICAgc3RhY2s8aW50PiYgc3QsCiAgICAgICAgICAgICAgIGludCYgdGltZXIsCiAgICAgICAgICAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIHNjY3MpCnsKICAgIGRpc2NbdV0gPSBsb3dbdV0gPSB0aW1lcisrOwogICAgc3QucHVzaCh1KTsKICAgIG9uU3RhY2tbdV0gPSB0cnVlOwoKICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICBpZiAoZGlzY1t2XSA9PSAtMSkgewogICAgICAgICAgICB0YXJqYW5ERlModiwgYWRqLCBkaXNjLCBsb3csIG9uU3RhY2ssIHN0LCB0aW1lciwgc2Njcyk7CiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1t2XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9uU3RhY2tbdl0pIHsKICAgICAgICAgICAgbG93W3VdID0gbWluKGxvd1t1XSwgZGlzY1t2XSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsb3dbdV0gPT0gZGlzY1t1XSkgewogICAgICAgIHZlY3RvcjxpbnQ+IGNvbXA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaW50IHYgPSBzdC50b3AoKTsgc3QucG9wKCk7CiAgICAgICAgICAgIG9uU3RhY2tbdl0gPSBmYWxzZTsKICAgICAgICAgICAgY29tcC5wdXNoX2JhY2sodik7CiAgICAgICAgICAgIGlmICh2ID09IHUpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzY2NzLnB1c2hfYmFjayhjb21wKTsKICAgIH0KfQoKdmVjdG9yPHZlY3RvcjxpbnQ+PiB0YXJqYW5TQ0MoaW50IG4sIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIGFkaikgewogICAgdmVjdG9yPGludD4gICAgZGlzYyhuLCAtMSksIGxvdyhuLCAwKTsKICAgIHZlY3Rvcjxib29sPiAgIG9uU3RhY2sobiwgZmFsc2UpOwogICAgc3RhY2s8aW50PiAgICAgc3Q7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHNjY3M7CiAgICBpbnQgdGltZXIgPSAwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaWYgKGRpc2NbaV0gPT0gLTEpCiAgICAgICAgICAgIHRhcmphbkRGUyhpLCBhZGosIGRpc2MsIGxvdywgb25TdGFjaywgc3QsIHRpbWVyLCBzY2NzKTsKICAgIH0KICAgIHJldHVybiBzY2NzOwp9CgovLyDilIDilIDilIAgbWFpbigpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgLy8gSWYgeW91IGV2ZXIgbmVlZCBuQ3I6CiAgICAvLyBpbml0RmFjcygpOwoKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIHZlY3RvcjxpbnQ+IGFycihuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFycltpXTsKICAgIH0KCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGFkaihuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICB1IC0tOyB2IC0tOwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICB9CgogICAgYXV0byBzY2NzID0gdGFyamFuU0NDKG4sIGFkaik7CgogICAgbGwgcmVzMSA9IDA7CiAgICBsbCByZXMyID0gMTsKICAgIGZvciAoYXV0byAmY29tcCA6IHNjY3MpIHsKICAgICAgICBpbnQgY3Vyck1pbiA9IElOVF9NQVg7CiAgICAgICAgaW50IGNudCAgICAgPSAwOwogICAgICAgIC8vIGZpbmQgdGhlIG1pbmltdW0gYXJyW3ZhbHVlXSBpbiB0aGlzIFNDQyBhbmQgY291bnQgaG93IG1hbnkgdGltZXMgaXQgYXBwZWFycwogICAgICAgIGZvciAoaW50IG5vZGUgOiBjb21wKSB7CiAgICAgICAgICAgIGlmIChhcnJbbm9kZV0gPCBjdXJyTWluKSB7CiAgICAgICAgICAgICAgICBjdXJyTWluID0gYXJyW25vZGVdOwogICAgICAgICAgICAgICAgY250ICAgICA9IDE7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJyW25vZGVdID09IGN1cnJNaW4pIHsKICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlczEgPSBhZGQocmVzMSwgY3Vyck1pbik7CiAgICAgICAgcmVzMiA9IG11bChyZXMyLCBjbnQpOwogICAgfQoKICAgIGNvdXQgPDwgcmVzMSA8PCAnICcgPDwgcmVzMiA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K