#include<deque>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<tuple>
#include<string>
#include<chrono>
#include<functional>
#include<iterator>
#include<random>
#include<unordered_set>
#include<array>
#include<map>
#include<iomanip>
#include<assert.h>
#include<list>
#include<bitset>
#include<stack>
#include<memory>
#include<numeric>
using namespace std;
using namespace std::chrono;
typedef long long int llint;
typedef long double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase
/*cout<<fixed<<setprecision(20);cin.tie(0);ios::sync_with_stdio(false);*/
const llint mod=1000000007;
const llint big=2.19e15+1;
const long double pai=3.141592653589793238462643383279502884197;
const long double eps=1e-12;
template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;}
template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;}
llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);}
llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;}
template<class T> void SO(T& ve){sort(ve.begin(),ve.end());}
template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());}
template<class T>llint LBI(const vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();}
template<class T>llint UBI(const vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();}
int p;
vector<vector<int>>go;//橋 
class state{
public:
	vector<int>zi;//残りの次数
	queue<int>ofque;
	vector<char>zyo;//頂点の状態
	//2 未決定 1 on 0 off
};
void toon(state&in,int ter){
	
	in.zi[ter]=1;
	for(auto it:go[ter]){
		if(in.zyo[it]!=2){continue;}
		in.zi[it]--;
		if(in.zi[it]==1){in.ofque.push(it);}
	}
}
int solve(state&in,int rest,int know){//破壊します
	//いろいろ行っている
	//頂点名は0~p に書き換わっている
	//for(int it:in.zyo){cerr<<it<<" ";}
	//cerr<<" rest="<<rest<<endl;
	int ter=-1;
	while(in.ofque.size()>0){
		ter=in.ofque.front();in.ofque.pop();
		if(in.zyo[ter]==2){break;}
		ter=-1;
	}
	if(ter>-1){//off処理
		in.zyo[ter]=0;
		for(auto it:go[ter]){
			if(in.zyo[it]!=2){continue;}
			rest--;
			if(rest<=know){return -1;}
			toon(in,it);in.zyo[it]=1;
		}
		return solve(in,rest,know);
	}
	//terが自由になる 次数の多いものを影響させる
	int sai=-1;
	for(int i=0;i<p;i++){
		if(in.zyo[i]==2&&maxeq(sai,in.zi[i])){ter=i;}
	}
	if(ter==-1){return rest;}
	int ans=-1;
	state onin=in;int onres=rest;
	onres--;toon(onin,ter);onin.zyo[ter]=1;
	if(onres>know){ans=solve(onin,onres,know);}
	
	
	in.zyo[ter]=0;
	for(auto it:go[ter]){
		if(in.zyo[it]!=2){continue;}
		rest--;toon(in,it);in.zyo[it]=1;
	}
	
	
	
	maxeq(ans,solve(in,rest,max(ans,know)));
	return ans;
}
int main(void){
	cout<<fixed<<setprecision(20);cin.tie(0);ios::sync_with_stdio(false);
	int i,n,m,K,j,k,mk;cin>>n>>m>>K;mk=K;
	vector<vector<int>>mgo(n);
	for(i=0;i<m;i++){
		int a,b;cin>>a>>b;
		a--;b--;
		mgo[a].pub(b);
		mgo[b].pub(a);
	}
	queue<int>que;
	vector<int>ban(n,-1);
	vector<int>ima;
	for(i=0;i<n;i++){
		if(ban[i]!=-1){continue;}
		p=0;
		que.push(i);
		while(que.size()){
			int t=que.front();que.pop();
			if(ban[t]!=-1){continue;}
			ban[t]=p;p++;
			ima.pub(t);
			for(auto it:mgo[t]){que.push(it);}
		}
		go.resize(p);
		state aaa;
		aaa.zyo=vector<char>(p,2);
		aaa.zi=vector<int>(p);
		for(j=0;j<p;j++){
			go[j].resize(mgo[ima[j]].size());
			aaa.zi[j]=mgo[ima[j]].size();
			for(k=0;k<mgo[ima[j]].size();k++){
				go[j][k]=ban[mgo[ima[j]][k]];
			}
		}
		
		if(p>1){K=solve(aaa,K,-1);}
		go.clear();
		ima.clear();
	}
	if(K<0){cout<<"Impossible"<<endl;}
	else{cout<<mk-K<<endl;}
	return 0;
}



Measured memory_bytes: 4516