import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws IOException {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	}

	//	//二分探索
	//k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//二分探索
	//k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	}

} import java.io.IOException; IOException java.io import java.util.ArrayList; ArrayList java.util import java.util.Arrays; Arrays java.util import java.util.Scanner; Scanner java.util public class Main {
	public static void main(String[] args) throws IOException {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	}

	//	//二分探索
	//k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//二分探索
	//k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	}

} Main public static void main(String[] args) throws IOException {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	} main {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) final int N = sc.nextInt(); N sc.nextInt() sc.nextInt sc final int K = sc.nextInt(); K sc.nextInt() sc.nextInt sc int[] A = new int[N + 1]; A new int[N + 1] N + 1 N 1 int[] d = new int[K]; d new int[K] K Arrays.fill(A, 0) Arrays.fill Arrays A 0 A[0]=100 A[0] A 0 100 for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		} int i = 0; int i = 0; i 0 i < K i K i++ i++ i {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		} {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		} d[i] = sc.nextInt() d[i] d i sc.nextInt() sc.nextInt sc for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			} int j =0; int j =0; j 0 j < d[i] j d[i] d i j++ j++ j {
				A[sc.nextInt()]++;
			} {
				A[sc.nextInt()]++;
			} A[sc.nextInt()]++ A[sc.nextInt()] A sc.nextInt() sc.nextInt sc int ans = 0; ans 0 for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		} int i = 1; int i = 1; i 1 i <= N i N i++ i++ i {
			if (A[i] == 0) {
				ans++;
			}
		} {
			if (A[i] == 0) {
				ans++;
			}
		} if (A[i] == 0) {
				ans++;
			} A[i] == 0 A[i] A i 0 {
				ans++;
			} ans++ ans System.out.println(ans) System.out.println System.out System System.out ans String[] args args //	//二分探索
	//k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	} binarySearch {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	} int lowerBorder = -1; lowerBorder -1 1 int upperBorder = orderedArray.length; upperBorder orderedArray.length orderedArray orderedArray.length int mid; mid while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		} upperBorder - lowerBorder > 1 upperBorder - lowerBorder upperBorder lowerBorder 1 {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		} mid = (upperBorder + lowerBorder) / 2 mid (upperBorder + lowerBorder) / 2 (upperBorder + lowerBorder) upperBorder lowerBorder 2 if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			} orderedArray[mid] <= num orderedArray[mid] orderedArray mid num {
				lowerBorder = mid;
			} lowerBorder = mid lowerBorder mid {
				upperBorder = mid;
			} upperBorder = mid upperBorder mid return lowerBorder; lowerBorder long num num long[] orderedArray orderedArray //二分探索
	//k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	} binarySearch {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	} int lowerBorder = -1; lowerBorder -1 1 int upperBorder = orderedList.size(); upperBorder orderedList.size() orderedList.size orderedList int mid; mid while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		} upperBorder - lowerBorder > 1 upperBorder - lowerBorder upperBorder lowerBorder 1 {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		} mid = (upperBorder + lowerBorder) / 2 mid (upperBorder + lowerBorder) / 2 (upperBorder + lowerBorder) upperBorder lowerBorder 2 if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			} orderedList.get(mid) <= num orderedList.get(mid) orderedList.get orderedList mid num {
				lowerBorder = mid;
			} lowerBorder = mid lowerBorder mid {
				upperBorder = mid;
			} upperBorder = mid upperBorder mid return lowerBorder; lowerBorder long num num ArrayList<Long> orderedList orderedList //aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	} gcd {
		return b == 0 ? a : gcd(b, a % b);
	} return b == 0 ? a : gcd(b, a % b); b == 0 ? a : gcd(b, a % b) b == 0 b 0 a gcd(b, a % b) gcd b a % b a b int a a int b b public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	} gcd {
		return b == 0 ? a : gcd(b, a % b);
	} return b == 0 ? a : gcd(b, a % b); b == 0 ? a : gcd(b, a % b) b == 0 b 0 a gcd(b, a % b) gcd b a % b a b long a a long b b public class Main {
	public static void main(String[] args) throws IOException {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	}

	//	//二分探索
	//k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//二分探索
	//k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	}

} public class Main {
	public static void main(String[] args) throws IOException {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	}

	//	//二分探索
	//k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//二分探索
	//k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	}

} Main
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws IOException {
		//		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//		String W	 = in.readLine();
		//		int num = Integer.parseInt(W.split(" ")[0]);

		Scanner sc = new Scanner(System.in);
		final int N = sc.nextInt();
		final int K = sc.nextInt();

		int[] A = new int[N + 1];
		int[] d = new int[K];
		Arrays.fill(A, 0);
		A[0]=100;

		for (int i = 0; i < K; i++) {
			d[i] = sc.nextInt();
			for (int j =0; j < d[i]; j++) {
				A[sc.nextInt()]++;
			}
		}
		int ans = 0;
		for (int i = 1; i <= N; i++) {
			if (A[i] == 0) {
				ans++;
			}
		}
		System.out.println(ans);

	}

	//	//二分探索
	//k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//二分探索
	//k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	//aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	}

}
