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 C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;
#define fst ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define endk cout<<"\n";
typedef long long int ll;
typedef long int l;
#define l(i,a,b) for(i=a;i<b;i++)
#define lo(i,a,b) for(i=a;i>=b;i--)
#define s(v) sort(v.begin(),v.end());
#define pb push_back;
#define vll vector<ll>
#define vint vector<int>
#define test() ll t;cin>>t;while(t--){solve();};
#define test1() int t=1;while(t--){solve();};
bool isPrime(ll x)
{
    ll i,n;
    n=sqrt(x);
    if(x==1) return false;
    if(x==2 || x==3) return true;
    for(i=2;i<=n;i++)
    {
        if(!(x%i)) return false;
    }
    return true;
}
ll power(ll x,ll y)
{
	ll ans=1;
	while(y>0)
	{
		if(y&1) ans=ans*x;
		x=x*x;
		y=y>>1;
	}
	return ans;
}
vll adj[100001];
vll visited(100001,0);
ll dfs(ll n)
{
    visited[n]=1;
    ll i,ans=1;
    for(i=0;i<adj[n].size();i++)
    {
        //cout<<adj[n][i]<<"s "<<n;
        //endk
        if(!visited[adj[n][i]])
        {
            ans+=(dfs(adj[n][i]));
        }
    }
    return ans;
}
int solve()
{
    ll n,m,i,ans=0,j;
    cin>>n>>m;
    vector<vll> v(m,vll (2));
    for(i=0;i<m;i++)
    {
        cin>>v[i][0]>>v[i][1];
        for(j=i-1;j>=0;j--)
        {
            if(v[i][0]==v[j][0] && v[i][1]==v[j][1])
            {
               // cout<<v[i][0]<<" "<<v[i][1];
                //endk
                break;
            }
        }
        if(j!=-1)
        {
            continue;
        }
            adj[v[i][0]].push_back(v[i][1]);
            //cout<<v[i][0]<<" "<<v[i][1];
            adj[v[i][1]].push_back(v[i][0]);
            //cout<<v[i][1]<<" "<<v[i][0];
    }
    while(1)
    {
        y:
        for(i=1;i<=n;i++)
        {
            if(!visited[i])
            {
                ans=max(ans,dfs(i));
                goto y;
            }      
        }
        break;
    }
    cout<<ans;
    return 0;
}
int main()
{
    fst;
    test1();
    return 0;
}