const MAXV = 10000;
type p_node = ^node;
node = record
vx: longint;
next: p_node;
end;
var list: array[1..MAXV] of p_node;
d, f: array[1..MAXV] of longint;
n, m, s: longint;
procedure add(u, v: longint);
var p, q: p_node;
begin
p := list[u]; q := p;
while (p <> nil) do
begin
if (p^.vx = v) then exit;
q := p;
p := p^.next;
end;
new(p); p^.vx := v;
if (list[u] = nil) then list[u] := p
else q^.next := p;
end;
procedure enter;
var fi: text;
i, u, v: longint;
begin
assign(fi, ''); reset(fi);
readln(fi, n, m, s);
for i := 1 to m do
begin
readln(fi, u, v);
add(u, v);
end;
close(fi);
end;
procedure init;
begin
filldword(d, sizeof(d) div sizeof(d[1]), 0);
d[s] := 1; f[s] := 1;
end;
procedure BFS;
type p_no = ^no;
no = record
vx: longint;
next: p_no;
end;
var front, rear: p_no;
u, v: longint;
p1: p_node;
procedure push(vx: longint);
var p: p_no;
begin
new(p); p^.vx := vx;
if (front = nil) then front := p
else rear^.next := p;
rear := p;
end;
function pop: longint;
var p: p_no;
begin
pop := front^.vx;
p := front;
front := front^.next;
dispose(p);
end;
begin
front := nil;
push(s);
repeat
u := pop;
p1 := list[u];
while (p1 <> nil) do
begin
v := p1^.vx;
if (d[v] = 0) then
begin
d[v] := d[u] + 1;
f[v] := f[u];
push(v);
end
else if (f[v] < 2) and (d[v] - 1 = d[u]) then inc(f[v], f[u]);
p1 := p1^.next;
end;
until front = nil;
end;
function count: longint;
var i: longint;
begin
count := 0;
for i := 1 to n do
if (f[i] > 1) then inc(count);
end;
BEGIN
enter;
init;
BFS;
writeln(count);
END.