#include <bits/stdc++.h>
using namespace std;
#define NMaxNoduri 100001
#define NMaxNoduri2 50005
#define NMaxNoduri3 10005
#define INFINIT 0x3f3f3f3f
#define flowmax 1005
ifstream fin("bfs.in");
ofstream fout("bfs.out");
class Clasa_Graf
{
int n, m;
vector<vector<int>> lista_adiacenta;
public:
Clasa_Graf();
~Clasa_Graf();
void dfs(int x,unordered_map<int,bool>& vector_vizitat);
void bfs(int x,unordered_map<int,bool>& vector_vizitat,list<int>& coada_bfs);
void sortare_topologica(int x,unordered_map<int,bool>& vector_vizitat,deque<int>& lista_sorttop);
void DFS1(int x, unordered_map<int,bool>& vector_vizitat, vector<int>& stiva);
void DFS2(int x, int nrctc, unordered_map<int,bool>& vector_vizitat_2, vector<int> componente[NMaxNoduri], vector<int> lista_adiacenta2[NMaxNoduri]);
void biconex(int start, int tp, unordered_map<int,int>& vizitat, int low[NMaxNoduri], stack<pair<int, int>>& stackCBC, vector <set <int>>& componentebcnx);
void dfs_muchie_critica(int curr, int prev,int time, int disc[NMaxNoduri], int low2[NMaxNoduri], vector<vector<int>>& ans);
bool HH(vector<int> grade);
int find_node(int x, int par[]);
void unite(int x,int y, int par[], int dim[]);
void DFS_darb(int curr, int vizitat[], int& dist_max, int& nod_departe);
bool BFSflow(int s, int fin, int f[flowmax][flowmax], int c[flowmax][flowmax], int tata[flowmax]);
bool cuplaj(int k, bool vector_vizitat[], int st[], int dr[]);
void infoarena_dfs();
void infoarena_bfs();
void infoarena_sortaret();
void infoarena_ctc();
void infoarena_biconex();
void leetcode_muchiecritica();
void havelhakimi();
void infoarena_dijkstra();
void infoarena_bellman_ford();
void infoarena_pmd();
void infoarena_apm();
void infoarena_roy_floyd();
void infoarena_darb();
void infoarena_maxflow();
void infoarena_ciclueuler();
void infoarena_hamilton();
void infoarena_cuplaj();
};
Clasa_Graf::Clasa_Graf()
{
n=0;
m=0;
}
Clasa_Graf::~Clasa_Graf()
{
}
void Clasa_Graf::dfs(int x, unordered_map<int,bool>& vector_vizitat)
{
vector_vizitat[x] = true;
for (int i=0; i<lista_adiacenta[x].size(); ++i)
if (vector_vizitat[lista_adiacenta[x][i]]==0)
dfs(lista_adiacenta[x][i],vector_vizitat);
}
void Clasa_Graf::bfs(int x, unordered_map<int,bool>& vector_vizitat, list<int>& coada_bfs)
{
int distanta_minima[NMaxNoduri];
memset(distanta_minima,-1, sizeof(distanta_minima));
vector_vizitat[x]=true;
coada_bfs.push_back(x);
distanta_minima[x]=0;
while(!coada_bfs.empty())
{
x = coada_bfs.front();
coada_bfs.pop_front();
for (int i=0; i<lista_adiacenta[x].size(); ++i)
{
if (distanta_minima[lista_adiacenta[x][i]]<0)
{
vector_vizitat[lista_adiacenta[x][i]] = true;
coada_bfs.push_back(lista_adiacenta[x][i]);
distanta_minima[lista_adiacenta[x][i]]=distanta_minima[x]+1;
}
}
}
for(int i=1; i<=n; i++)
fout<<distanta_minima[i]<<" ";
}
void Clasa_Graf::infoarena_dfs()
{
int comp_conexe=0;
unordered_map<int,bool> vector_vizitat;
fin>>n>>m;
for(int i=1; i<=m; i++)
{
int a,b;
fin>>a>>b;
lista_adiacenta[a].push_back(b);
lista_adiacenta[b].push_back(a);
}
dfs(1,vector_vizitat);
comp_conexe=1;
for(int i=2; i<=n; i++)
if(vector_vizitat[i] == 0)
{
dfs(i,vector_vizitat);
comp_conexe++;
}
fout<<comp_conexe;
}
void Clasa_Graf::infoarena_bfs()
{
int st;
unordered_map<int,bool> vector_vizitat;
list<int> coada_bfs;
fin>>n>>m>>st;
for(int i=1; i<=m; i++)
{
int a,b;
fin>>a>>b;
lista_adiacenta[a].push_back(b);
}
bfs(st,vector_vizitat,coada_bfs);
}
int main()
{
Clasa_Graf g;
//g.infoarena_dfs();
g.infoarena_bfs();
//g.infoarena_sortaret();
//g.infoarena_ctc();
//g.infoarena_biconex();
//g.leetcode_muchiecritica();
//g.havelhakimi();
//g.infoarena_dijkstra();
//g.infoarena_bellman_ford();
//g.infoarena_pmd();
//g.infoarena_apm();
//g.infoarena_roy_floyd();
//g.infoarena_darb();
//g.infoarena_maxflow();
//g.infoarena_ciclueuler();
//g.infoarena_cuplaj();
return 0;
}