n, m, k = gets.split.map(&:to_i)
g = [0] * n

m.times do
	i, j = gets.split.map(&:to_i)
	i -= 1
	j -= 1
	g[i] |= (1 << j)
	g[j] |= (1 << i)
end

def del_trivial(g)
	trivial = 0
	loop do
		i = g.index {|x| x.to_s(2).count(?1) <= 1}
		break if !i
		if g[i].to_s(2).count(?1) == 0
			g.delete_at(i)
			g.map! do |x|
				l = (x >> i + 1)
				r = x & ((1 << i) - 1)
				(l << i) | r
			end
		else
			trivial += 1
			mask = (g[i] + (1 << i))
			(0..g.size-1).each do |j|
				if mask[j] == 1
					g[j] = 0
				else
					g[j] -= (g[j] & mask)
				end
			end
		end
	end

	return trivial
end

def f(graph, k)
	g = graph.dup
	i = (0..graph.size-1).max_by {|i| graph[i].to_s(2).count(?1) }
	return k >= 0 ? k : -Float::INFINITY if !i || graph[i] == 0
	return -Float::INFINITY if k <= 0

	(0..graph.size-1).each do |j|
		g[j] -= (1 << i) if g[j][i] == 1
	end
	g[i] = 0

	t = del_trivial(g)

	max = f(g, k-1-t)

	g = graph.dup
	d = g[i].to_s(2).count(?1)
	return max if d > k

	mask = g[i] | (1 << i)
	(0..graph.size-1).each do |j|
		if mask[j] == 1
			g[i] = 0
		else
			g[i] -= g[i] & mask
		end
	end

	t = del_trivial(g)
	ret = f(g, k-d-t)

	return ret > max ? ret : max
end

t = del_trivial(g)
c = f(g, k - t)
puts c >= 0 ? k - c : 'Impossible'