#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
tuple<vector<int>, vector<int>, vector<long long>>
bfsShortestMaxFiveCount(int n, const vector<vector<int>>& g, const vector<int>& val) {
vector<int> dist(n+1, -1), max5(n+1, -1);
vector<long long> ways(n+1, 0);
queue<int> q;
dist[1] = 0;
max5[1] = (val[1] == 5 ? 1 : 0);
ways[1] = 1;
q.push(1);
while (!q.empty()) {
int v = q.front(); q.pop();
for (int u : g[v]) {
int add = (val[u] == 5 ? 1 : 0);
if (dist[u] == -1) { // first time: shortest
dist[u] = dist[v] + 1;
max5[u] = max5[v] + add;
ways[u] = ways[v];
q.push(u);
} else if (dist[u] == dist[v] + 1) { // another shortest path
int cand5 = max5[v] + add;
if (cand5 > max5[u]) { // better 5-count replaces
max5[u] = cand5;
ways[u] = ways[v];
} else if (cand5 == max5[u]) { // tie: add ways
ways[u] += ways[v];
}
}
}
}
return {dist, max5, ways};
}
int main() {
int n, m;
cin >> n >> m;
vector<int> val(n+1);
for (int i = 1; i <= n; ++i) cin >> val[i];
vector<vector<int>> g(n+1);
for (int i = 0; i < m; ++i) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
auto [dist, max5, ways] = bfsShortestMaxFiveCount(n, g, val);
for (int i = 1; i <= n; ++i) {
cout << dist[i] << " " << max5[i] << " " << ways[i] << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx0dXBsZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR1cGxlPHZlY3RvcjxpbnQ+LCB2ZWN0b3I8aW50PiwgdmVjdG9yPGxvbmcgbG9uZz4+CmJmc1Nob3J0ZXN0TWF4Rml2ZUNvdW50KGludCBuLCBjb25zdCB2ZWN0b3I8dmVjdG9yPGludD4+JiBnLCBjb25zdCB2ZWN0b3I8aW50PiYgdmFsKSB7CiAgICB2ZWN0b3I8aW50PiBkaXN0KG4rMSwgLTEpLCBtYXg1KG4rMSwgLTEpOwogICAgdmVjdG9yPGxvbmcgbG9uZz4gd2F5cyhuKzEsIDApOwogICAgcXVldWU8aW50PiBxOwoKICAgIGRpc3RbMV0gPSAwOwogICAgbWF4NVsxXSA9ICh2YWxbMV0gPT0gNSA/IDEgOiAwKTsKICAgIHdheXNbMV0gPSAxOwogICAgcS5wdXNoKDEpOwoKICAgIHdoaWxlICghcS5lbXB0eSgpKSB7CiAgICAgICAgaW50IHYgPSBxLmZyb250KCk7IHEucG9wKCk7CiAgICAgICAgZm9yIChpbnQgdSA6IGdbdl0pIHsKICAgICAgICAgICAgaW50IGFkZCA9ICh2YWxbdV0gPT0gNSA/IDEgOiAwKTsKICAgICAgICAgICAgaWYgKGRpc3RbdV0gPT0gLTEpIHsgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWU6IHNob3J0ZXN0CiAgICAgICAgICAgICAgICBkaXN0W3VdID0gZGlzdFt2XSArIDE7CiAgICAgICAgICAgICAgICBtYXg1W3VdID0gbWF4NVt2XSArIGFkZDsKICAgICAgICAgICAgICAgIHdheXNbdV0gPSB3YXlzW3ZdOwogICAgICAgICAgICAgICAgcS5wdXNoKHUpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RbdV0gPT0gZGlzdFt2XSArIDEpIHsgLy8gYW5vdGhlciBzaG9ydGVzdCBwYXRoCiAgICAgICAgICAgICAgICBpbnQgY2FuZDUgPSBtYXg1W3ZdICsgYWRkOwogICAgICAgICAgICAgICAgaWYgKGNhbmQ1ID4gbWF4NVt1XSkgeyAgICAgICAgICAgLy8gYmV0dGVyIDUtY291bnQgcmVwbGFjZXMKICAgICAgICAgICAgICAgICAgICBtYXg1W3VdID0gY2FuZDU7CiAgICAgICAgICAgICAgICAgICAgd2F5c1t1XSA9IHdheXNbdl07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbmQ1ID09IG1heDVbdV0pIHsgICAvLyB0aWU6IGFkZCB3YXlzCiAgICAgICAgICAgICAgICAgICAgd2F5c1t1XSArPSB3YXlzW3ZdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4ge2Rpc3QsIG1heDUsIHdheXN9Owp9CgppbnQgbWFpbigpIHsKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKCiAgICB2ZWN0b3I8aW50PiB2YWwobisxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgY2luID4+IHZhbFtpXTsKCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGcobisxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgaW50IHUsIHY7IGNpbiA+PiB1ID4+IHY7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2sodSk7CiAgICB9CgogICAgYXV0byBbZGlzdCwgbWF4NSwgd2F5c10gPSBiZnNTaG9ydGVzdE1heEZpdmVDb3VudChuLCBnLCB2YWwpOwoKICAgIAogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgY291dCA8PCBkaXN0W2ldIDw8ICIgIiA8PCBtYXg1W2ldIDw8ICIgIiA8PCB3YXlzW2ldIDw8ICJcbiI7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=