Problem:
Score : 400 points

Problem Statement

There are N persons called Person 1 through Person N.

You are given M facts that "Person A_i and Person B_i are friends." The same fact may be given multiple times.

If X and Y are friends, and Y and Z are friends, then X and Z are also friends. There is no friendship that cannot be derived from the M given facts.

Takahashi the evil wants to divide the N persons into some number of groups so that every person has no friend in his/her group.

At least how many groups does he need to make?

Constraints

2 \leq N \leq 2\times 10^5

0 \leq M \leq 2\times 10^5

1\leq A_i,B_i\leq N

A_i \neq B_i

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
\vdots
A_M B_M

Output

Print the answer.

Sample Input 1

5 3
1 2
3 4
5 1

Sample Output 1

3

Dividing them into three groups such as \{1,3\}, \{2,4\}, and \{5\} achieves the goal.

Sample Input 2

4 10
1 2
2 1
1 2
2 1
1 2
1 3
1 4
2 3
2 4
3 4

Sample Output 2

4

Sample Input 3

10 4
3 1
4 1
5 9
2 6

Sample Output 3

3

Solution in Java (OpenJDK 11.0.6) (judge verdict: Accepted)

import java.io.*;
import java.util.*;
// i want to become the best
class Main{
	public static void main(String[] args) throws Exception{
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		//int n = Integer.parseInt(reader.readLine());
		int[] list = Arrays.stream(reader.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
	    //System.out.println(list[1]*list[2]>=list[0]?"Yes":"No");
		int N = list[0];
		int M = list[1];
		HashSet<Integer>[] graph = new HashSet[N+1];
		for(int i = 1;i<=N;i++) graph[i] = new HashSet<Integer>();
		for(int i = 0;i<M;i++){
			String[] lo = reader.readLine().split(" ");
			int u = Integer.parseInt(lo[0]);
			int v = Integer.parseInt(lo[1]);
			graph[u].add(v);
			graph[v].add(u);
		}
		boolean[] visited = new boolean[N+1];
		Queue<Integer> q = new LinkedList<Integer>();
		int ans = 0;
		for(int i = 1;i<=N;i++){
			if(visited[i]) continue;
			q.add(i);
			int cand = 0;
			visited[i] = true;
			while(!q.isEmpty()){
				int src = q.remove();
				//visited[src] = true;
				cand++;
				for(int o:graph[src]) if(!visited[o]){
					q.add(o);
					visited[o] = true;
				}
			}
			ans = Math.max(ans,cand);
		}
		System.out.println(ans);
	}
}
class pair implements Comparable<pair>{
		long a = 0;
		int b = 0;
		public pair(long a,int b){
			this.a = a;
			this.b = b;
		}
		@Override
		public int compareTo(pair p){
			if(this.a == p.a) return -(Integer.compare(this.b,p.b));
			else return -(Long.compare(this.a,p.a));
		}
		@Override
		public String toString(){
			return a+" "+b;
		}
	}