#include <bits/stdc++.h>
using namespace std;

#include <atcoder/dsu>

int main() {
    int64_t N, M;
    cin >> N >> M;

    vector<int64_t> u(M), v(M);
    for (int64_t i = 0; i < M; i++) {
        cin >> u[i] >> v[i];
        u[i]--, v[i]--;
    }

    atcoder::dsu dsu(N);
    vector<int64_t> op_num(N, 0);
    for (int64_t i = M - 1; i >= 0; i--) {
        const int64_t lu = dsu.leader(u[i]);
        const int64_t lv = dsu.leader(v[i]);
        if (dsu.same(u[i], v[i])) {
            op_num[lu]++;
            continue;
        }
        const int64_t su = op_num[lu];
        const int64_t sv = op_num[lv];
        const int64_t l = dsu.merge(u[i], v[i]);
        op_num[l] = max(su, sv) + 1;
    }
    cout << *max_element(op_num.begin(), op_num.end()) << endl;
}