#include<unordered_map>
#include<unordered_set>
#include<functional>
#include<algorithm>
#include<iostream>
#include<hash_map>
#include<iterator>
#include<iomanip>
#include<numeric>
#include<cstring>
#include<vector>
#include<bitset>
#include<string>
#include<deque>
#include<stack>
#include<queue>
#include<array>
#include<cmath>
#include<list>
#include<map>
#include<set>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
#define ordered_set tree<ll, null_type,less_equal<ll>, \
rb_tree_tag,tree_order_statistics_node_update>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define inf INT32_MAX
#define linf INT64_MAX
#define pf push_front
#define pb push_back
#define ppb pop_back
#define ppf pop_front
#define ff first
#define ss second
/*ACPC 2021 ISA-*/
ll fastPow(ll n,ll k/*,ll m*/){
if(k==0)return 1;
ll res=fastPow(n,k/2/*,m*/)/*%m*/;
res=(res*res)/*%m*/;
if(k&1)res=(res*n)/*%m*/;
return res/*%m*/;
}
ll fastPow(ll n,ll k,ll m){
if(k==0)return 1;
ll res=fastPow(n,k/2,m)%m;
res=(res*res)%m;
if(k&1)res=(res*n)%m;
return res%m;
}
ll calcMod(ll a,ll m){
return (a%m+m)%m;
}
ll Ceil(ll n,ll m){
return (n+m-1)/m;
}
const ll mod=1e9+7;
vector<int>prt;
int Find(int k){
if(prt[k]<0)return k;
return prt[k]=Find(prt[k]);
}
bool Union(int u,int v){
int pU=Find(u),pV=Find(v);
if(pU==pV)return 0;
if(prt[pU]>prt[pV])swap(pU,pV);
prt[pU]+=prt[pV],prt[pV]=pU;
return 1;
}
bool solve(){
int n,m;
cin>>n>>m;
prt.resize(n+1,-1);
vector<pii>edges;
int x=0;
for(int i=0;i<m;++i){
int u,v;
cin>>u>>v;
if(Union(u,v)==0){
x++;
}
else{
edges.pb({u,v});
}
for(int j=1;j<=n;++j)prt[j]=-1;
for(const auto &[a,b]:edges){
Union(a,b);
}
for(int k=0;k<x;++k){
set<pii>st;
for(int j=1;j<=n;++j){
if(prt[j]<0){
st.insert({prt[j],j});
}
}
auto it1=st.begin();
st.erase(st.begin());
auto it2=st.begin();
Union(it1->ss,it2->ss);
}
int mx=0;
for(int j=1;j<=n;++j){
if(prt[j]<0){
mx=max(mx,abs(prt[j])-1);
}
}
cout<<mx<<"\n";
}
return 1;
}
int main(){
/*freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);*/
//ios_base::sync_with_stdio(false);
//cin.tie(nullptr);
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
I2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGU8dW5vcmRlcmVkX3NldD4KI2luY2x1ZGU8ZnVuY3Rpb25hbD4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8aGFzaF9tYXA+CiNpbmNsdWRlPGl0ZXJhdG9yPgojaW5jbHVkZTxpb21hbmlwPgojaW5jbHVkZTxudW1lcmljPgojaW5jbHVkZTxjc3RyaW5nPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPGJpdHNldD4KI2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxkZXF1ZT4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxhcnJheT4KI2luY2x1ZGU8Y21hdGg+CiNpbmNsdWRlPGxpc3Q+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8c2V0PgoKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KCnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbDsKdHlwZWRlZiBkb3VibGUgZGI7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGRiOwoKI2RlZmluZSBvcmRlcmVkX3NldCB0cmVlPGxsLCBudWxsX3R5cGUsbGVzc19lcXVhbDxsbD4sIFwKcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPgojZGVmaW5lIHBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgcGxsIHBhaXI8bGwsbGw+CiNkZWZpbmUgaW5mIElOVDMyX01BWAojZGVmaW5lIGxpbmYgSU5UNjRfTUFYCiNkZWZpbmUgcGYgcHVzaF9mcm9udAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIHBwYiBwb3BfYmFjawojZGVmaW5lIHBwZiBwb3BfZnJvbnQKI2RlZmluZSBmZiBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAovKkFDUEMgMjAyMSBJU0EtKi8KbGwgZmFzdFBvdyhsbCBuLGxsIGsvKixsbCBtKi8pewogICAgaWYoaz09MClyZXR1cm4gMTsKCiAgICBsbCByZXM9ZmFzdFBvdyhuLGsvMi8qLG0qLykvKiVtKi87CgogICAgcmVzPShyZXMqcmVzKS8qJW0qLzsKCiAgICBpZihrJjEpcmVzPShyZXMqbikvKiVtKi87CgogICAgcmV0dXJuIHJlcy8qJW0qLzsKfQpsbCBmYXN0UG93KGxsIG4sbGwgayxsbCBtKXsKICAgIGlmKGs9PTApcmV0dXJuIDE7CgogICAgbGwgcmVzPWZhc3RQb3cobixrLzIsbSklbTsKCiAgICByZXM9KHJlcypyZXMpJW07CgogICAgaWYoayYxKXJlcz0ocmVzKm4pJW07CgogICAgcmV0dXJuIHJlcyVtOwp9CmxsIGNhbGNNb2QobGwgYSxsbCBtKXsKICAgIHJldHVybiAoYSVtK20pJW07Cn0KbGwgQ2VpbChsbCBuLGxsIG0pewogICAgcmV0dXJuIChuK20tMSkvbTsKfQpjb25zdCBsbCBtb2Q9MWU5Kzc7CnZlY3RvcjxpbnQ+cHJ0OwppbnQgRmluZChpbnQgayl7CiAgICBpZihwcnRba108MClyZXR1cm4gazsKICAgIHJldHVybiBwcnRba109RmluZChwcnRba10pOwp9CmJvb2wgVW5pb24oaW50IHUsaW50IHYpewogICAgaW50IHBVPUZpbmQodSkscFY9RmluZCh2KTsKICAgIGlmKHBVPT1wVilyZXR1cm4gMDsKCiAgICBpZihwcnRbcFVdPnBydFtwVl0pc3dhcChwVSxwVik7CiAgICBwcnRbcFVdKz1wcnRbcFZdLHBydFtwVl09cFU7CiAgICByZXR1cm4gMTsKfQpib29sIHNvbHZlKCl7CiAgICBpbnQgbixtOwogICAgY2luPj5uPj5tOwoKICAgIHBydC5yZXNpemUobisxLC0xKTsKCiAgICB2ZWN0b3I8cGlpPmVkZ2VzOwoKICAgIGludCB4PTA7CiAgICBmb3IoaW50IGk9MDtpPG07KytpKXsKICAgICAgICBpbnQgdSx2OwogICAgICAgIGNpbj4+dT4+djsKCiAgICAgICAgaWYoVW5pb24odSx2KT09MCl7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgZWRnZXMucGIoe3Usdn0pOwogICAgICAgIH0KCiAgICAgICAgZm9yKGludCBqPTE7ajw9bjsrK2opcHJ0W2pdPS0xOwoKICAgICAgICBmb3IoY29uc3QgYXV0byAmW2EsYl06ZWRnZXMpewogICAgICAgICAgICBVbmlvbihhLGIpOwogICAgICAgIH0KCiAgICAgICAgZm9yKGludCBrPTA7azx4Oysrayl7CiAgICAgICAgICAgIHNldDxwaWk+c3Q7CiAgICAgICAgICAgIGZvcihpbnQgaj0xO2o8PW47KytqKXsKICAgICAgICAgICAgICAgIGlmKHBydFtqXTwwKXsKICAgICAgICAgICAgICAgICAgICBzdC5pbnNlcnQoe3BydFtqXSxqfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGF1dG8gaXQxPXN0LmJlZ2luKCk7CiAgICAgICAgICAgIHN0LmVyYXNlKHN0LmJlZ2luKCkpOwogICAgICAgICAgICBhdXRvIGl0Mj1zdC5iZWdpbigpOwoKICAgICAgICAgICAgVW5pb24oaXQxLT5zcyxpdDItPnNzKTsKICAgICAgICB9CgogICAgICAgIGludCBteD0wOwogICAgICAgIGZvcihpbnQgaj0xO2o8PW47KytqKXsKICAgICAgICAgICAgaWYocHJ0W2pdPDApewogICAgICAgICAgICAgICAgbXg9bWF4KG14LGFicyhwcnRbal0pLTEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvdXQ8PG14PDwiXG4iOwogICAgfQogICAgcmV0dXJuIDE7Cn0KaW50IG1haW4oKXsKICAgIC8qZnJlb3BlbigiaW5wdXQudHh0IiwiciIsc3RkaW4pOwogICAgZnJlb3Blbigib3V0cHV0LnR4dCIsInciLHN0ZG91dCk7Ki8KCiAgICAvL2lvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgLy9jaW4udGllKG51bGxwdHIpOwoKICAgIGludCB0PTE7CiAgICAvL2Npbj4+dDsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9