#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin>>n>>m;
vector<int> nodeVal(n);
for(int i=0;i<n;i++){
cin>>nodeVal[i];
}
vector<int> adjList[n];
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
adjList[x].push_back(y);
adjList[y].push_back(x);
}
int source=1;
vector<int> visited(n, 0);
vector<int> level(n, 0);
vector<int> ways(n, 0);
vector<int> maxPossibleFives(n, 0);
queue<int> q;
q.push(source);
visited[source]=1;
if(nodeVal[source]==5)
maxPossibleFives[source]=1;
else
maxPossibleFives[source]=0;
ways[source]=1;
while(!q.empty()){
int node=q.front();
q.pop();
visited[node]=1;
for(auto adjNode : adjList[node]){
int pathFives;
if(nodeVal[adjNode] == 5) {
pathFives = maxPossibleFives[node] + 1;
}
else {
pathFives = maxPossibleFives[node];
}
if(!visited[adjNode]){
//first time visit
visited[adjNode]=1;
maxPossibleFives[adjNode] = pathFives;
level[adjNode]=level[node]+1;
ways[adjNode]=ways[node];
q.push(adjNode);
}
else{
if(level[adjNode]==level[node]+1){
//node adjNode is on shortest path
// ways[adjNode]=ways[adjNode]+ways[node];
if(pathFives > maxPossibleFives[adjNode]){
maxPossibleFives[adjNode]=pathFives;
ways[adjNode]=ways[node];
}
else if(pathFives==maxPossibleFives[node]){
ways[adjNode]=ways[node]+ways[node];
}
}
else{
//node adjNode is not on the shortest path
//no need to count
}
}
}
}
for(int i=0;i<maxPossibleFives.size();i++){
cout<<"node "<<i<<" : "<<level[i] + maxPossibleFives[i];
cout<<"\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKCWludCBuLCBtOwoJY2luPj5uPj5tOwoJdmVjdG9yPGludD4gbm9kZVZhbChuKTsKCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCWNpbj4+bm9kZVZhbFtpXTsKCX0KCXZlY3RvcjxpbnQ+IGFkakxpc3Rbbl07Cglmb3IoaW50IGk9MDtpPG07aSsrKXsKCQlpbnQgeCx5OwoJCWNpbj4+eD4+eTsKCQlhZGpMaXN0W3hdLnB1c2hfYmFjayh5KTsKCQlhZGpMaXN0W3ldLnB1c2hfYmFjayh4KTsKCX0KCQoJaW50IHNvdXJjZT0xOwoJdmVjdG9yPGludD4gdmlzaXRlZChuLCAwKTsKCXZlY3RvcjxpbnQ+IGxldmVsKG4sIDApOwoJdmVjdG9yPGludD4gd2F5cyhuLCAwKTsKCXZlY3RvcjxpbnQ+IG1heFBvc3NpYmxlRml2ZXMobiwgMCk7CglxdWV1ZTxpbnQ+IHE7CglxLnB1c2goc291cmNlKTsKCXZpc2l0ZWRbc291cmNlXT0xOwoJaWYobm9kZVZhbFtzb3VyY2VdPT01KQoJCW1heFBvc3NpYmxlRml2ZXNbc291cmNlXT0xOwoJZWxzZQoJCW1heFBvc3NpYmxlRml2ZXNbc291cmNlXT0wOwoJd2F5c1tzb3VyY2VdPTE7Cgl3aGlsZSghcS5lbXB0eSgpKXsKCQlpbnQgbm9kZT1xLmZyb250KCk7CgkJcS5wb3AoKTsKCQl2aXNpdGVkW25vZGVdPTE7CgkJZm9yKGF1dG8gYWRqTm9kZSA6IGFkakxpc3Rbbm9kZV0pewoJCQlpbnQgcGF0aEZpdmVzOwoJCQlpZihub2RlVmFsW2Fkak5vZGVdID09IDUpIHsKCQkJCXBhdGhGaXZlcyA9IG1heFBvc3NpYmxlRml2ZXNbbm9kZV0gKyAxOwoJCQl9IAoJCQllbHNlIHsKCQkJCXBhdGhGaXZlcyA9IG1heFBvc3NpYmxlRml2ZXNbbm9kZV07CgkJCX0KCQkJaWYoIXZpc2l0ZWRbYWRqTm9kZV0pewoJCQkJLy9maXJzdCB0aW1lIHZpc2l0CgkJCQl2aXNpdGVkW2Fkak5vZGVdPTE7CgkJCQltYXhQb3NzaWJsZUZpdmVzW2Fkak5vZGVdID0gcGF0aEZpdmVzOwoJCQkJbGV2ZWxbYWRqTm9kZV09bGV2ZWxbbm9kZV0rMTsKCQkJCXdheXNbYWRqTm9kZV09d2F5c1tub2RlXTsKCQkJCXEucHVzaChhZGpOb2RlKTsKCQkJfQoJCQllbHNlewoJCQkJaWYobGV2ZWxbYWRqTm9kZV09PWxldmVsW25vZGVdKzEpewoJCQkJCS8vbm9kZSBhZGpOb2RlIGlzIG9uIHNob3J0ZXN0IHBhdGgKCQkJCQkvLyB3YXlzW2Fkak5vZGVdPXdheXNbYWRqTm9kZV0rd2F5c1tub2RlXTsKCQkJCQlpZihwYXRoRml2ZXMgPiBtYXhQb3NzaWJsZUZpdmVzW2Fkak5vZGVdKXsKCQkJCQkJbWF4UG9zc2libGVGaXZlc1thZGpOb2RlXT1wYXRoRml2ZXM7CgkJCQkJCXdheXNbYWRqTm9kZV09d2F5c1tub2RlXTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwYXRoRml2ZXM9PW1heFBvc3NpYmxlRml2ZXNbbm9kZV0pewoJCQkJCQl3YXlzW2Fkak5vZGVdPXdheXNbbm9kZV0rd2F5c1tub2RlXTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlewoJCQkJCS8vbm9kZSBhZGpOb2RlIGlzIG5vdCBvbiB0aGUgc2hvcnRlc3QgcGF0aAoJCQkJCS8vbm8gbmVlZCB0byBjb3VudAoJCQkJfQoJCQl9CgkJfQoJfQoJZm9yKGludCBpPTA7aTxtYXhQb3NzaWJsZUZpdmVzLnNpemUoKTtpKyspewoJCWNvdXQ8PCJub2RlICI8PGk8PCIgOiAiPDxsZXZlbFtpXSArIG1heFBvc3NpYmxlRml2ZXNbaV07CgkJY291dDw8IlxuIjsKCX0KCXJldHVybiAwOwp9Cg==