#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define vmax 100001
using namespace std;
ifstream f("bfs.in");
ofstream g("bfs.out");
struct nod
{
int y;
nod *urm;
};
queue<int> q;
nod *lis[vmax],*p;
int n,m,start,i,j,dist[vmax],viz[vmax],d=0;
void citire(nod *lis[])
{
memset(dist, -1, sizeof(dist));
memset(viz, 0, sizeof(viz));
f>>n>>m>>start;
while(f>>i>>j)
{
p = new nod;
p->y = j;
p->urm = lis[i];
lis[i] = p;
}
}
void bfs(nod *lis[], int start)
{
q.push(start);
dist[start] = d; viz[start] = 1;
while(!q.empty())
{
for(p=lis[q.front()]; p!=NULL; p=p->urm)
if(viz[p->y] == 0)
{
q.push(p->y);
viz[p->y] = 1;
dist[p->y] = dist[q.front()] + 1;
}
q.pop();
}
}
int main()
{
citire(lis);
bfs(lis,start);
for(i=1; i<=n; i++)
g << dist[i] << ' ';
return 0;
}