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.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class AA {
	static class his{
		int one, two;
		public his(int o, int t) { 
			one = o;
			two = t;
		}
	}
	static int [][] adjList ;
	static boolean [] vis;
	static void dfs(int u) {
		if(vis[u])
			return;
		vis[u] = true;
		for(int i = 0;i<adjList[u].length;i++) {
			int child = adjList[u][i];
			dfs(child);
		}
//		return count;
	}
	static class pair implements Comparable<pair>{
		int leader, count;
		public pair(int leader, int count) {
			this.count = count;
			this.leader = leader;
			
		}
		@Override
		public int compareTo(pair p) {
			return p.count-count;
		}
	}
public static void main(String[] args) throws IOException{
	Scanner sc= new Scanner(System.in);
	int n = sc.nextInt(), m = sc.nextInt(),s =sc.nextInt()-1;
	adjList = new int[n][0];
	his [] h = new his[m];
	int [] count =new int[n];
	vis =new boolean[n];
	for (int i = 0; i < m; i++) {
		int one =sc.nextInt()-1;
		int two =sc.nextInt()-1;
		h[i] = new his(one,two);
		count[one]++;
		
	}
	for (int i = 0; i < adjList.length; i++) {
		adjList[i] = new int[count[i]];
	
	}
	int [] counter = new int[n];
	for (int i = 0; i < h.length; i++) {
		adjList[h[i].one][counter[h[i].one]++] = h[i].two;
	}
	ArrayList<Integer> [] tree = new ArrayList[n];
	for (int i = 0; i < tree.length; i++) {
		tree[i] = new ArrayList<Integer>();
	}
	boolean [] vis2 = new boolean[n];
	dfs(s);
	int count2 = 0;
	boolean [] taken =new boolean[n];
	for (int i = 0; i < vis.length; i++) {
		if(vis[i])
			vis2[i] = true;
	}
	pair [] p = new pair[n];
	for (int i = 0; i < n; i++) {
		if(i==s)
			continue;
		if(vis2[i])
			continue;
		vis =new boolean[n];
		dfs(i);
		vis2[i] = true;
		for (int j = 0; j < vis.length; j++) {
			if(vis[j])
				if(vis2[j]) {
					if(taken[j]) {
						taken[j] = false;
						count2--;
					}
				}else {
					vis2[j] = true;
				}
		}
		count2++;
		taken[i] =true;
	}
		System.out.println(count2);
			

}
static void shuffle(pair [] p) {
	for (int i = 0; i < p.length; i++) {
		int idx = (int)(Math.random()*p.length);
		pair tmp = p[idx];
		p[idx] = p[i];
		p[i] = tmp;
	}
}

static class Scanner 
{
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

	public String next() throws IOException 
	{
		while (st == null || !st.hasMoreTokens()) 
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public int nextInt() throws IOException {return Integer.parseInt(next());}
	
	public long nextLong() throws IOException {return Long.parseLong(next());}

	public String nextLine() throws IOException {return br.readLine();}
	
	public double nextDouble() throws IOException
	{
		String x = next();
		StringBuilder sb = new StringBuilder("0");
		double res = 0, f = 1;
		boolean dec = false, neg = false;
		int start = 0;
		if(x.charAt(0) == '-')
		{
			neg = true;
			start++;
		}
		for(int i = start; i < x.length(); i++)
			if(x.charAt(i) == '.')
			{
				res = Long.parseLong(sb.toString());
				sb = new StringBuilder("0");
				dec = true;
			}
			else
			{
				sb.append(x.charAt(i));
				if(dec)
					f *= 10;
			}
		res += Long.parseLong(sb.toString()) / f;
		return res * (neg?-1:1);
	}
	
	public boolean ready() throws IOException {return br.ready();}


}





}
