import std.container;
import std.range;
import std.algorithm;
import std.array;
import std.string;
import std.conv;
import std.stdio;
import std.container;

void main() {
	int n, m;
	readf(" %s %s\n", &n, &m);

	auto tree = new int[n];
	foreach (size_t i, ref e;tree) {
		e = cast(int)i;
	}

	int getRoot(int a) {
		if (tree[a] == a) {
			return a;
		}
		return tree[a] = getRoot(tree[a]);
	}

	bool sameRoot(int a, int b) {
		return getRoot(a) == getRoot(b);
	}

	void unite(int a, int b) {
		auto rootA = getRoot(a);
		tree[getRoot(b)] = rootA;
	}

	foreach (i;0..m) {
		int a, b;
		readf(" %s %s", &a, &b);
		--a;
		--b;

		unite(a, b);
	}

	auto count = new int[2 * 10 ^^ 5 + 1];

	foreach (int i;0..n) {
		getRoot(i);
		++count[tree[i]];
	}

	count.reduce!max.writeln;
}
