#include <fstream>
#define DMAX 100001
using namespace std;
ofstream fout ("bfs.out");
struct nod
{int inf;
struct nod *urm;
};
typedef struct nod *Lista;
Lista A[DMAX];
int C[DMAX];
int n, m, vf_start;
int lg[DMAX], prec[DMAX];
void citire(); void BFS(); void inserare(Lista&, Lista, int);
int main()
{
int i;
citire();
BFS ();
for (i=1; i<=n; ++i)
fout<<lg[i]-1<<" ";
fout.close();
return 0;
}
void citire()
{
int i, x, y;
ifstream fin ("bfs.in");
fin>>n>>m>>vf_start;
for (i=1; i<=m; ++i)
{
fin>>x>>y;
inserare (A[x], NULL, y);
}
fin.close();
return;
}
void BFS ()
{
int prim, ultim, p;
Lista q;
C[1]=vf_start; lg[vf_start]=1;//l-am vizitat
prim=ultim=1;
while (prim<=ultim)
{
//extrag un element din coada
p=C[prim++];
//vizitez toti vecinii lui p
for (q=A[p]; q; q=q->urm)
if (!lg[q->inf])
{
lg[q->inf]=lg[p]+1;
C[++ultim]=q->inf;
prec[q->inf]=p;
}
}
return;
}
void inserare (Lista &prim, Lista p, int x)
{
Lista q;
q=new nod;
q->inf=x;
if (p)
{
q->urm=p->urm;
p->urm=q;
}
else
{
q->urm=prim;
prim=q;
}
return;
}