There are n cities and m roads in Berland. Each road connects a pair of cities. The roads in Berland are one-way.

What is the minimum number of new roads that need to be built to make all the cities reachable from the capital?

New roads will also be one-way.

Input

The first line of input consists of three integers n, m and s (1 ≤ n ≤ 5000, 0 ≤ m ≤ 5000, 1 ≤ s ≤ n) — the number of cities, the number of roads and the index of the capital. Cities are indexed from 1 to n.

The following m lines contain roads: road i is given as a pair of cities u_i, v_i (1 ≤ u_i, v_i ≤ n, u_i ≠ v_i). For each pair of cities (u, v), there can be at most one road from u to v. Roads in opposite directions between a pair of cities are allowed (i.e. from u to v and from v to u).

Output

Print one integer — the minimum number of extra roads needed to make all the cities reachable from city s. If all the cities are already reachable from s, print 0.

Examples

Input

9 9 1
1 2
1 3
2 3
1 5
5 6
6 1
1 8
9 8
7 1


Output

3


Input

5 4 5
1 2
2 3
3 4
4 1


Output

1

Note

The first example is illustrated by the following:

<image>

For example, you can add roads (6, 4), (7, 9), (1, 7) to make all the cities reachable from s = 1.

The second example is illustrated by the following:

<image>

In this example, you can add any one of the roads (5, 1), (5, 2), (5, 3), (5, 4) to make all the cities reachable from s = 5.
	                       //ARNAV KUMAR MANDAL//
                                     //XYPHER//
 
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.io.*;

public class Solution{
	static LinkedList<Integer> l[];
	static boolean b[];
	static boolean ok[];
	static int v;
	static int sum = 0;
	Solution(int n){
		this.v = n;
		b = new boolean[n];
		ok = new boolean[n];
		l = new LinkedList[n];
		for(int i=0;i<n;i++)
			l[i] = new LinkedList<Integer>();
	}

	public static void add(int x, int y){
		l[x].add(y);
	}
	
	public static void dfs(int x){
		ok[x] = true;
		for(int k : l[x]){
			if(!ok[k]){
				dfs(k);
			}
		}
	}
	public static void dfs2(int x){
		b[x] = true;
		sum++;
		for(int k : l[x]){
			if(!b[k]){
				dfs2(k);
			}
		}
	}
	public static class pair{
		int x;
		int y;
		pair(int x, int y){
			this.x = x;
			this.y = y;
		}
	}
	
//--------------------------MAIN---------------------------------------------------------------------//
	public static void main(String[] args) throws IOException {
			int n = ni();
			int m = ni();
			int s = ni() - 1;
			Solution g = new Solution(n);
			PriorityQueue<pair> q = new PriorityQueue<pair>( new Comparator<pair>() {

				public int compare(pair n1, pair n2) {
			       return -(n1.x - n2.x);
			    }
			});
			for(int i = 0; i < m; i++) {
				int x = ni() - 1;
				int y = ni() - 1;
				g.add(x, y);
			}
			int ans = 0;
			dfs(s);
			for(int i=0;i<n;i++) {
				if(!b[i]) {
					sum = 0;
					b = new boolean[n];
					dfs2(i);
					q.add(new pair(sum, i));
				}
			}
			while(!q.isEmpty()) {
				pair x = q.poll();
				if(!ok[x.y]) {
					dfs(x.y);ans++;
				}
			}
			opl(ans);
			

	}
//--------------------------FAST IO objects/methods--------------------------------------------------//
	
	static Reader in= new Reader(System.in);
	static OutputWriter out = new OutputWriter(System.out);
	private static int ni(){int n = in.nextInt();return n;}
	private static long nl(){long n = in.nextLong();return n;}
	private double nd(){return Double.parseDouble(ns()); }
	private static String ns(){String s = in.nextString();return s;}
	private static int[] nai(int n){int[] a = new int[n];for(int i = 0;i < n;i++)a[i] = ni();return a;}
	private static long[] nal(int n){long[] a = new long[n];for(int i = 0;i < n;i++)a[i] = nl();return a;}
	private static StringBuilder sb(String s){StringBuilder S = new StringBuilder(s);return S;}
	private static HashSet<Integer> hsi(){HashSet<Integer> s = new HashSet<Integer>();return s;}
	private static HashSet<Long> hsl(){HashSet<Long> s = new HashSet<Long>();return s;}
	private static HashMap<Integer,Integer> hmii(){HashMap<Integer,Integer> h = new HashMap<Integer,Integer>();return h;}
	private static HashMap<Long,Long> hmll(){HashMap<Long,Long> h = new HashMap<Long,Long>();return h;}
	private static HashMap<String,Integer> hmsi(){HashMap<String,Integer> h = new HashMap<String,Integer>();return h;}
	private static int[][] nmi(int n, int m){int A[][] = new int[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++) {A[i][j] = ni();}}return A;}
	private static char[][] nmc(int n, int m){char A[][] = new char[n][m];for(int i=0;i<n;i++){StringBuilder s=sb(ns());for(int j=0;j<m;j++){A[i][j]=s.charAt(j);}}return A;}
	private static void op(Object o) {out.print(o);}
	private static void opl(Object o) {out.println(o);}
	private static void opai(int[] o){for(int a:o)op(a+" ");opl("");}
	private static void opad(double[] o){for(double a:o)op(a+" ");opl("");}
	private static void opal(long[] o){for(long a:o)op(a+" ");opl("");}
	private static void opac(char[] o){for(char a:o)op(a);opl("");}
	private static void opas(String[] o){for(String a:o)op(a+" ");opl("");}
	private static void opmi(int[][] o) {for(int i=0;i<o.length;i++)opai(o[i]);}
	private static void opml(long[][] o) {for(int i=0;i<o.length;i++)opal(o[i]);}
	private static void opmc(char[][] o) {for(int i=0;i<o.length;i++)opac(o[i]);}

//--------------------------FAST IO------------------------------------------------------------------//
	private static class Reader {
		private InputStream stream;
		private byte[] buf = new byte[4*1024];
		private int curChar;
		private int numChars;
		private SpaceCharFilter filter;
		
		public Reader(InputStream stream) {
			this.stream = stream;
		}
		
		public int read() {
			if (numChars == -1) {
				throw new InputMismatchException();
			}
			if (curChar >= numChars) {
				curChar = 0;
				try {
					numChars = stream.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (numChars <= 0) {
					return -1;
				}
			}
			return buf[curChar++];
		}
		
		public int nextInt() {
			int c = read();
			while (isSpaceChar(c)) {
				c = read();
			}
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			int res = 0;
			do {
				if (c < '0' || c > '9') {
					throw new InputMismatchException();
				}
				res *= 10;
				res += c - '0';
				c = read();
			} while (!isSpaceChar(c));
			return res * sgn;
		}
		
		public String nextString() {
			int c = read();
			while (isSpaceChar(c)) {
				c = read();
			}
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = read();
			} while (!isSpaceChar(c));
			return res.toString();
		}
		
		public double nextDouble() {
			int c = read();
			while (isSpaceChar(c)) {
				c = read();
			}
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			double res = 0;
			while (!isSpaceChar(c) && c != '.') {
				if (c == 'e' || c == 'E') {
					return res * Math.pow(10, nextInt());
				}
				if (c < '0' || c > '9') {
					throw new InputMismatchException();
				}
				res *= 10;
				res += c - '0';
				c = read();
			}
			if (c == '.') {
				c = read();
				double m = 1;
				while (!isSpaceChar(c)) {
					if (c == 'e' || c == 'E') {
						return res * Math.pow(10, nextInt());
					}
					if (c < '0' || c > '9') {
						throw new InputMismatchException();
					}
					m /= 10;
					res += (c - '0') * m;
					c = read();
				}
			}
			return res * sgn;
		}
		
		public long nextLong() {
			int c = read();
			while (isSpaceChar(c)) {
				c = read();
			}
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			long res = 0;
			do {
				if (c < '0' || c > '9') {
					throw new InputMismatchException();
				}
				res *= 10;
				res += c - '0';
				c = read();
			} while (!isSpaceChar(c));
			return res * sgn;
		}
		
		public boolean isSpaceChar(int c) {
			if (filter != null) {
				return filter.isSpaceChar(c);
			}
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}
		
		public String next() {
			return nextString();
		}
		
		public interface SpaceCharFilter {
			public boolean isSpaceChar(int ch);
		}
	}
	private static class OutputWriter {
		private final PrintWriter writer;
		
		public OutputWriter(OutputStream outputStream) {
			writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
		}
		
		public OutputWriter(Writer writer) {
			this.writer = new PrintWriter(writer);
		}
		
		
		
		public void println(Object... objects) {
			print(objects);
			writer.println();
			writer.flush();
		}
		
		public void print(Object... objects) {
			for (int i = 0; i < objects.length; i++) {
				if (i != 0) {
					writer.print(' ');
				}
				writer.print(objects[i]);
			}
			writer.flush();
		}
		
		public void close() {
			writer.close();
		}
		
		public void flush() {
			writer.flush();
		}
	}
}  