- {$M 400000000} 
- const maxn = 10000; 
-       fi = ''; 
-       fo = ''; 
- type tqueue = record 
-                 front,rear,nitem:word; 
-                 item: array[0..maxn-1] of word; 
-               end; 
- var n,s,t:word; 
-     m:longint; 
-     g: array[1..maxn,0..maxn] of word; 
-     trace: array[1..maxn] of word; 
-     queue: tqueue; 
- procedure enter; 
- var i:longint; 
-     u,v:word; 
- begin 
-   assign(input,fi); 
-   reset(input); 
-   readln(n,m,s,t); 
-   for i:=1 to n do 
-   g[i,0]:=0; 
-   for i:=1 to m do 
-   begin 
-     readln(u,v); 
-     inc(g[u,0]); 
-     g[u,g[u,0]]:=v; 
-   end; 
-   close(input); 
- end; 
- procedure initq; 
- begin 
-   with queue do 
-   begin 
-     front:=0; 
-     rear:=1; 
-     nitem:=0; 
-   end; 
- end; 
- procedure push(v:word); 
- begin 
-   with queue do 
-   begin 
-     inc(nitem); 
-     front:=(front+1) mod maxn; 
-     item[front]:=v; 
-   end; 
- end; 
- function pop:word; 
- begin 
-   with queue do 
-   begin 
-     dec(nitem); 
-     pop:=item[rear]; 
-     rear:=(rear+1) mod maxn; 
-   end; 
- end; 
- function empty:boolean; 
- begin 
-   with queue do 
-   empty:=(nitem=0); 
- end; 
- procedure printtrace; 
- var i:word; 
- begin 
-   for i:=1 to n do 
-   write(trace[i],' '); 
-   writeln; 
- end; 
- procedure bfs; 
- var i,j:word; 
-     visit: array[1..maxn] of boolean; 
- begin 
-   initq; 
-   fillchar(visit,sizeof(visit),false); 
-   fillchar(trace,sizeof(trace),0); 
-   push(s); 
-   visit[s]:=true; 
-   repeat 
-     i:=pop; 
-     for j:=1 to g[i,0] do 
-     if not visit[g[i,j]] then 
-     begin 
-       push(g[i,j]); 
-       visit[g[i,j]]:=true; 
-       trace[g[i,j]]:=i; 
-       if g[i,j]=t then exit; 
-     end; 
-   until empty; 
- end; 
- procedure solve; 
- var lock,res:word; 
-     visit: array[1..maxn] of boolean; 
- function dfs(i:longint):boolean; 
- var j:longint; 
-     p:boolean; 
- begin 
-   visit[i]:=true; 
-   if i=t then dfs:=true 
-   else 
-   if i=lock then dfs:=false 
-   else 
-   begin 
-     p:=false; 
-     for j:=1 to g[i,0] do 
-     if not visit[g[i,j]] then 
-     begin 
-       p:=p or dfs(g[i,j]); 
-       if p then break; 
-     end; 
-     dfs:=p; 
-   end; 
- end; 
- begin 
-   assign(output,fo); 
-   rewrite(output); 
-   bfs; 
-   lock:=trace[t]; 
-   res:=0; 
-   while (lock<>s) and (lock<>0) do 
-   begin 
-     fillchar(visit,sizeof(visit),false); 
-     if not dfs(s) then inc(res); 
-     lock:=trace[lock]; 
-   end; 
-   writeln(res); 
-   close(output); 
- end; 
- begin 
-   enter; 
-   solve; 
- end. 
				eyRNIDQwMDAwMDAwMH0KY29uc3QgbWF4biA9IDEwMDAwOwogICAgICBmaSA9ICcnOwogICAgICBmbyA9ICcnOwp0eXBlIHRxdWV1ZSA9IHJlY29yZAogICAgICAgICAgICAgICAgZnJvbnQscmVhcixuaXRlbTp3b3JkOwogICAgICAgICAgICAgICAgaXRlbTogYXJyYXlbMC4ubWF4bi0xXSBvZiB3b3JkOwogICAgICAgICAgICAgIGVuZDsKdmFyIG4scyx0OndvcmQ7CiAgICBtOmxvbmdpbnQ7CiAgICBnOiBhcnJheVsxLi5tYXhuLDAuLm1heG5dIG9mIHdvcmQ7CiAgICB0cmFjZTogYXJyYXlbMS4ubWF4bl0gb2Ygd29yZDsKICAgIHF1ZXVlOiB0cXVldWU7CnByb2NlZHVyZSBlbnRlcjsKdmFyIGk6bG9uZ2ludDsKICAgIHUsdjp3b3JkOwpiZWdpbgogIGFzc2lnbihpbnB1dCxmaSk7CiAgcmVzZXQoaW5wdXQpOwogIHJlYWRsbihuLG0scyx0KTsKICBmb3IgaTo9MSB0byBuIGRvCiAgZ1tpLDBdOj0wOwogIGZvciBpOj0xIHRvIG0gZG8KICBiZWdpbgogICAgcmVhZGxuKHUsdik7CiAgICBpbmMoZ1t1LDBdKTsKICAgIGdbdSxnW3UsMF1dOj12OwogIGVuZDsKICBjbG9zZShpbnB1dCk7CmVuZDsKcHJvY2VkdXJlIGluaXRxOwpiZWdpbgogIHdpdGggcXVldWUgZG8KICBiZWdpbgogICAgZnJvbnQ6PTA7CiAgICByZWFyOj0xOwogICAgbml0ZW06PTA7CiAgZW5kOwplbmQ7CnByb2NlZHVyZSBwdXNoKHY6d29yZCk7CmJlZ2luCiAgd2l0aCBxdWV1ZSBkbwogIGJlZ2luCiAgICBpbmMobml0ZW0pOwogICAgZnJvbnQ6PShmcm9udCsxKSBtb2QgbWF4bjsKICAgIGl0ZW1bZnJvbnRdOj12OwogIGVuZDsKZW5kOwpmdW5jdGlvbiBwb3A6d29yZDsKYmVnaW4KICB3aXRoIHF1ZXVlIGRvCiAgYmVnaW4KICAgIGRlYyhuaXRlbSk7CiAgICBwb3A6PWl0ZW1bcmVhcl07CiAgICByZWFyOj0ocmVhcisxKSBtb2QgbWF4bjsKICBlbmQ7CmVuZDsKZnVuY3Rpb24gZW1wdHk6Ym9vbGVhbjsKYmVnaW4KICB3aXRoIHF1ZXVlIGRvCiAgZW1wdHk6PShuaXRlbT0wKTsKZW5kOwpwcm9jZWR1cmUgcHJpbnR0cmFjZTsKdmFyIGk6d29yZDsKYmVnaW4KICBmb3IgaTo9MSB0byBuIGRvCiAgd3JpdGUodHJhY2VbaV0sJyAnKTsKICB3cml0ZWxuOwplbmQ7CnByb2NlZHVyZSBiZnM7CnZhciBpLGo6d29yZDsKICAgIHZpc2l0OiBhcnJheVsxLi5tYXhuXSBvZiBib29sZWFuOwpiZWdpbgogIGluaXRxOwogIGZpbGxjaGFyKHZpc2l0LHNpemVvZih2aXNpdCksZmFsc2UpOwogIGZpbGxjaGFyKHRyYWNlLHNpemVvZih0cmFjZSksMCk7CiAgcHVzaChzKTsKICB2aXNpdFtzXTo9dHJ1ZTsKICByZXBlYXQKICAgIGk6PXBvcDsKICAgIGZvciBqOj0xIHRvIGdbaSwwXSBkbwogICAgaWYgbm90IHZpc2l0W2dbaSxqXV0gdGhlbgogICAgYmVnaW4KICAgICAgcHVzaChnW2ksal0pOwogICAgICB2aXNpdFtnW2ksal1dOj10cnVlOwogICAgICB0cmFjZVtnW2ksal1dOj1pOwogICAgICBpZiBnW2ksal09dCB0aGVuIGV4aXQ7CiAgICBlbmQ7CiAgdW50aWwgZW1wdHk7CmVuZDsKcHJvY2VkdXJlIHNvbHZlOwp2YXIgbG9jayxyZXM6d29yZDsKICAgIHZpc2l0OiBhcnJheVsxLi5tYXhuXSBvZiBib29sZWFuOwpmdW5jdGlvbiBkZnMoaTpsb25naW50KTpib29sZWFuOwp2YXIgajpsb25naW50OwogICAgcDpib29sZWFuOwpiZWdpbgogIHZpc2l0W2ldOj10cnVlOwogIGlmIGk9dCB0aGVuIGRmczo9dHJ1ZQogIGVsc2UKICBpZiBpPWxvY2sgdGhlbiBkZnM6PWZhbHNlCiAgZWxzZQogIGJlZ2luCiAgICBwOj1mYWxzZTsKICAgIGZvciBqOj0xIHRvIGdbaSwwXSBkbwogICAgaWYgbm90IHZpc2l0W2dbaSxqXV0gdGhlbgogICAgYmVnaW4KICAgICAgcDo9cCBvciBkZnMoZ1tpLGpdKTsKICAgICAgaWYgcCB0aGVuIGJyZWFrOwogICAgZW5kOwogICAgZGZzOj1wOwogIGVuZDsKZW5kOwpiZWdpbgogIGFzc2lnbihvdXRwdXQsZm8pOwogIHJld3JpdGUob3V0cHV0KTsKICBiZnM7CiAgbG9jazo9dHJhY2VbdF07CiAgcmVzOj0wOwogIHdoaWxlIChsb2NrPD5zKSBhbmQgKGxvY2s8PjApIGRvCiAgYmVnaW4KICAgIGZpbGxjaGFyKHZpc2l0LHNpemVvZih2aXNpdCksZmFsc2UpOwogICAgaWYgbm90IGRmcyhzKSB0aGVuIGluYyhyZXMpOwogICAgbG9jazo9dHJhY2VbbG9ja107CiAgZW5kOwogIHdyaXRlbG4ocmVzKTsKICBjbG9zZShvdXRwdXQpOwplbmQ7CmJlZ2luCiAgZW50ZXI7CiAgc29sdmU7CmVuZC4=