import java.util.* ;
public class Main {
public static void main
( String [ ] args
) { Scanner sc
= new Scanner
( System .
in ) ;
int n = sc.nextInt ( ) ; // nodes
int m = sc.nextInt ( ) ; // number of edges
// Adjancecy list representation
List
< Integer
> [ ] G
= new List [ n
+ 1 ] ; for ( int i = 0 ; i <= n; i++ ) {
G[ i] = new ArrayList<> ( ) ;
}
// Reading edges and building undirected graph
for ( int i = 0 ; i < m; i++ ) {
int u = sc.nextInt ( ) ;
int v = sc.nextInt ( ) ;
G[ u] .add ( v) ;
G[ v] .add ( u) ;
}
Queue< Integer> q = new LinkedList<> ( ) ;
int source = sc.nextInt ( ) ; // starting node for BFS
q.add ( source) ;
int [ ] used = new int [ n+ 1 ] ; // track visited nodes
used[ source] = 1 ;
int [ ] lvl = new int [ n+ 1 ] ; // shortest distance from source
lvl[ source] = 0 ;
// BFS traversal
while ( ! q.isEmpty ( ) ) {
int v = q.poll ( ) ; // current node and poll removes and return the head of the node
for ( int u : G[ v] ) { // explore all neighbors
if ( used[ u] == 0 ) { // visit unvisited neighbor
q.add ( u) ;
used[ u] = 1 ;
lvl[ u] = lvl[ v] + 1 ; // distance = parent's distance + 1
}
}
}
// Output shortest distances from source to all nodes
for ( int i = 1 ; i <= n; i++ ) {
System .
out .
println ( "Distance from source node " + source
+ " to node " + i
+ " is " + lvl
[ i
] + "." ) ;
if ( used[ i] == 0 ) {
System .
out .
println ( "You cannot visit " + i
+ "from the source node " + source
) ; }
else {
System .
out .
println ( "You can visit " + i
+ "from the source node " + source
) ;; }
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgc2MgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwoKICAgICAgICBpbnQgbiA9IHNjLm5leHRJbnQoKTsgLy8gbm9kZXMKICAgICAgICBpbnQgbSA9IHNjLm5leHRJbnQoKTsgLy8gbnVtYmVyIG9mIGVkZ2VzCgogICAgICAgIC8vIEFkamFuY2VjeSBsaXN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgTGlzdDxJbnRlZ2VyPltdIEcgPSBuZXcgTGlzdFtuKzFdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBHW2ldID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWFkaW5nIGVkZ2VzIGFuZCBidWlsZGluZyB1bmRpcmVjdGVkIGdyYXBoCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgaW50IHUgPSBzYy5uZXh0SW50KCk7CiAgICAgICAgICAgIGludCB2ID0gc2MubmV4dEludCgpOwogICAgICAgICAgICBHW3VdLmFkZCh2KTsKICAgICAgICAgICAgR1t2XS5hZGQodSk7CiAgICAgICAgfQoKICAgICAgICBRdWV1ZTxJbnRlZ2VyPiBxID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgIGludCBzb3VyY2UgPSBzYy5uZXh0SW50KCk7IC8vIHN0YXJ0aW5nIG5vZGUgZm9yIEJGUwogICAgICAgIHEuYWRkKHNvdXJjZSk7CgogICAgICAgIGludFtdIHVzZWQgPSBuZXcgaW50W24rMV07IC8vIHRyYWNrIHZpc2l0ZWQgbm9kZXMKICAgICAgICB1c2VkW3NvdXJjZV0gPSAxOwoKICAgICAgICBpbnRbXSBsdmwgPSBuZXcgaW50W24rMV07IC8vIHNob3J0ZXN0IGRpc3RhbmNlIGZyb20gc291cmNlCiAgICAgICAgbHZsW3NvdXJjZV0gPSAwOwoKICAgICAgICAvLyBCRlMgdHJhdmVyc2FsCiAgICAgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgewogICAgICAgICAgICBpbnQgdiA9IHEucG9sbCgpOyAvLyBjdXJyZW50IG5vZGUgYW5kIHBvbGwgcmVtb3ZlcyBhbmQgcmV0dXJuIHRoZSBoZWFkIG9mIHRoZSBub2RlCiAgICAgICAgICAgIGZvciAoaW50IHUgOiBHW3ZdKSB7IC8vIGV4cGxvcmUgYWxsIG5laWdoYm9ycwogICAgICAgICAgICAgICAgaWYgKHVzZWRbdV0gPT0gMCkgeyAvLyB2aXNpdCB1bnZpc2l0ZWQgbmVpZ2hib3IKICAgICAgICAgICAgICAgICAgICBxLmFkZCh1KTsKICAgICAgICAgICAgICAgICAgICB1c2VkW3VdID0gMTsKICAgICAgICAgICAgICAgICAgICBsdmxbdV0gPSBsdmxbdl0gKyAxOyAvLyBkaXN0YW5jZSA9IHBhcmVudCdzIGRpc3RhbmNlICsgMQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBPdXRwdXQgc2hvcnRlc3QgZGlzdGFuY2VzIGZyb20gc291cmNlIHRvIGFsbCBub2RlcwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRpc3RhbmNlIGZyb20gc291cmNlIG5vZGUgIiArIHNvdXJjZSArICIgdG8gbm9kZSAiICsgaSArICIgaXMgIiArIGx2bFtpXSArICIuIik7CiAgICAKCQkJIGlmICh1c2VkW2ldID09IDApIHsKICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiWW91IGNhbm5vdCB2aXNpdCAiICsgaSArImZyb20gdGhlIHNvdXJjZSBub2RlICIrc291cmNlKTsKCQkJCSB9IAoJCQllbHNlIHsKICAgIAkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJZb3UgY2FuIHZpc2l0ICIgKyBpICsiZnJvbSB0aGUgc291cmNlIG5vZGUgIitzb3VyY2UpOzsKCQkJCSB9CgkJfQoKICAgIH0KfQo=