#include <stdio.h>
#include <stdlib.h>
typedef struct _Node
{
int data;
struct _Node *next;
}Node;
void adaugare_dupa(Node *p,int valoare)
{
Node *q=(Node*)malloc(sizeof(Node));
q->next=p->next;
q->data=valoare;
p->next=q;
}
void show(Node *p, FILE *g)
{
Node *q=p->next;
if(q==p)
fprintf(g,"0\n");
else
{
while(q!=p)
{
fprintf(g,"%d ", q->data);
q=q->next;
}
fprintf(g,"\n");
}
}
void edges_to_matrix()
{
FILE *f=fopen("grafuri.in", "r");
FILE *g=fopen("grafuri.out", "w");
int n,m,M[6][6],x,y,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
M[i][j]=0;
fscanf(f,"%d %d", &n, &m);
for(i=0;i<m;i++)
{
fscanf(f,"%d%d", &x, &y);
M[x][y]=M[y][x]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
fprintf(g,"%d ", M[i][j]);
fprintf(g,"\n");
}
}
void BFS(Node *p[],int n,int nod,FILE *g)
{
int L=1,i,j,cost[n],coada[n];
for(i=1;i<=n;i++)
cost[i]=-1;
coada[L]=nod;
cost[nod]=0;
Node *q;
for(i=1;i<=L;i++)
{
q=p[coada[i]]->next;
while(q!=p[coada[i]])
{
if(cost[q->data]==-1)
{
coada[++L]=q->data;
cost[coada[L]]=cost[coada[i]]+1;
}
q=q->next;
}
}
for(i=1;i<=n;i++)
fprintf(g,"%d ", cost[i]);
}
int main()
{
FILE *f=fopen("bfs.in", "r");
FILE *g=fopen("bfs.out", "w");
int n,m,x,y,i,j,nod;
Node *p[100001];
fscanf(f,"%d %d %d", &n, &m, &nod);
for(i=1;i<=n;i++)
{
p[i]=(Node*)malloc(sizeof(Node));
p[i]->next=p[i];
p[i]->data=0;
}
for(i=0;i<m;i++)
{
fscanf(f,"%d%d", &x ,&y);
adaugare_dupa(p[x],y);
}
//for(i=1;i<=n;i++)
// show(p[i],g);
BFS(p,n,nod,g);
return 0;
}