import java.util.*;

public class Mis {

	public static int mis(BitSet[] g, BitSet unused) {
		int v = -1;
		for (int u = unused.nextSetBit(0); u >= 0; u = unused.nextSetBit(u + 1))
			if (v == -1 || g[v].cardinality() > g[u].cardinality())
				v = u;
		if (v == -1)
			return 0;
		int res = -1;
		BitSet nv = (BitSet) g[v].clone();
		nv.and(unused);
		for (int y = nv.nextSetBit(0); y >= 0; y = nv.nextSetBit(y + 1)) {
			BitSet newUnused = (BitSet) unused.clone();
			newUnused.andNot(g[y]);
			res = Math.max(res, 1 + mis(g, newUnused));
		}
		return res;
	}

	// random test
	public static void main(String[] args) {
		Random rnd = new Random(1);
		for (int step = 0; step < 1000; step++) {
			int n = rnd.nextInt(16) + 1;
			BitSet[] g = new BitSet[n];
			for (int i = 0; i < g.length; i++) {
				g[i] = new BitSet(n);
				// for convenience of mis()
				g[i].set(i);
			}
			for (int i = 0; i < n; i++)
				for (int j = 0; j < i; j++)
					if (rnd.nextBoolean()) {
						g[i].set(j);
						g[j].set(i);
					}
			BitSet unused = new BitSet();
			unused.set(0, n);
			int res1 = mis(g, unused);
			int res2 = misSlow(g);
			if (res1 != res2)
				throw new RuntimeException();
		}
	}

	static int misSlow(BitSet[] g) {
		int res = 0;
		int n = g.length;
		for (int set = 0; set < 1 << n; set++) {
			boolean ok = true;
			for (int i = 0; i < n; i++)
				for (int j = 0; j < i; j++)
					ok &= (set & (1 << i)) == 0 || (set & (1 << j)) == 0 || !g[i].get(j);
			if (ok)
				res = Math.max(res, Integer.bitCount(set));
		}
		return res;
	}
}
