#include <fstream>
#include <vector>
#include <string>
// #include <iostream>
#include <queue>
using namespace std;
ifstream cin("bfs.in");
ofstream cout("bfs.out") ;
vector <int> L[100001];
int vis[100001];
int n,m,s;
int d[100001];
// void dfs(int node) {
// vis[node]= 1;
// for(auto vec : L[node]) {
// if(vis[vec]==0)
// dfs(vec) ;
// }
// }
// int main() {
// // implementarre dfs, numarare comp conexe
// int n,m;
// cin>>n>>m;
// for(int i=1;i<=m; ++i) {
// int x,y;
// cin>>x>>y;
// L[x].push_back(y);
// L[y].push_back(x);
// }
// int nr = 0;
// for(int i=1; i<=n; ++i) {
// if(vis[i] == 0){
// nr++;
// dfs(i);
// }
// }
// cout<<nr;
// return 0;
// }
const int INF = 1e9;
void bfs(int sursa ) {
for(int i=1; i<=n; ++i) {
d[i] = INF;
}
d[sursa] = 0;
queue<int> q;
q.push(sursa) ;
while(!q.empty()) {
int node = q.front() ;
q.pop() ;
for(auto vec : L[node]) {
if(d[vec] > d[node] + 1) {
//d[vec] == inf
d[vec ] = d[node] +1 ;
q.push(vec) ;
}
}
}
}
int main() {
//garful e oriemtat
cin>>n>>m>>s;
for(int i=1;i<=m; ++i) {
int x,y;
cin>>x>>y;
L[x].push_back(y);
}
bfs(s) ;
for(int i =1 ;i<=n; ++i) {
if(d[i] == INF) d[i] = -1;
cout<<d[i] <<" " ;
}
return 0;
}