#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define IN "bfs.in"
#define OUT "bfs.out"
#define pb push_back
vector<int> G[100009];
queue<int>Q;
int n , m , ST;
int P[100009];
void Read()
{
int i , x , y;
scanf ( "%d%d%d" , &n , &m , &ST );
for ( i = 1 ; i <= m ; i ++ ){
scanf ( "%d%d" , &x , &y );
G[x].pb(y);
}
}
void Init()
{
memset (P,-1,sizeof(P));
}
void BFS(int x)
{
int nod , i;
Init();
P[x] = 0;
Q.push(x);
while ( !Q.empty() )
{
nod = Q.front();
for ( i = 0 ; i < G[nod].size() ; i ++ )
if ( P[G[nod][i]] == -1 )
P[G[nod][i]] = P[nod]+1 , Q.push(G[nod][i]);
Q.pop();
}
}
void Solve()
{
int i;
BFS(ST);
for ( i = 1 ; i <= n ; i ++ )
printf ( "%d " , P[i] );
}
int main()
{
freopen ( IN , "r" , stdin );
freopen ( OUT , "w" , stdout );
Read();
Solve();
}