/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}
	j = 0;
	for(i = 2; i <= n; i ++) {
		if(edge[1][j] == i) {
			j ++;
			continue;
		}
		if(edge[i].size() == n - 1) {
			vis.erase(i);
			q.push(i);
			_k ++;
		}
	}
	if(_k > k) {
		printf("impossible\n");
		return 0;
	}
	j = 0;
	for(i = 2; i <= n; i ++) {
		if(_k == k) break;
		if(edge[1][j] == i) {
			j ++;
			continue;
		}
		if(edge[i].size() != n - 1) {
			vis.erase(i);
			q.push(i);
			_k ++;
		}
	}

	if(_k != k) {
		printf("impossible\n");
		return 0;
	}

	dbg(_k);

	/*pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			//if(_k == k) break;
		}
		//if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}*/

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				/*while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					pre = *it1;
					one.erase(*it1);
				}*/
				pre = *it;
				q.push(*it);
				vis.erase(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	/*int al = n - 1 - edge[1].size() + 1;
	if(vis.size() || (al - cnt > k)) {*/
	if(vis.size()) {
		dbg(vis.size());
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = one.upper_bound(prec);
				if(it == one.end()) break;
				if(*it >= edge[i][j]) break;
				cnt ++;
				one.erase(*it);
				prec = *it;
			}
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				vis.erase(*it);
				pre = *it;
				q.push(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	if(vis.size() || (edge[1].size() - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

void dfs(int i)
{
	dbg(i);
	int pre = 0;
	for(int j = 0; j < edge[i].size(); j ++) {
		while(true) {
			auto it = vis.upper_bound(pre);
			if(it == vis.end()) break;
			if(*it >= edge[i][j]) break;
			vis.erase(*it);
			//q.push(*it);
			dfs(*it);
			pre = *it;
		}
		pre = edge[i][j];
	}
}

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif
	int n, m, u, v, k, _k, pre, c, i, j, prec;

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = _k = 0;
	for(i = 0; i < edge[1].size(); i ++) {
		while(true) {
			auto it = vis.upper_bound(pre);
			if(it == vis.end()) break;
			if(*it >= edge[1][i]) break;
			vis.erase(*it);
			//q.push(*it);
			_k ++;
			dfs(*it);
			pre = *it;
		}
		pre = edge[1][i];
	}
	dbg(_k, k);
	if(_k > k) {
		dbg(1);
		printf("impossible\n");
		return 0;
	}
	if(n - edge[1].size() < k) {
		dbg(2);
		printf("impossible\n");
		return 0;
	}
	if(vis.size()) {
		dbg(3);
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				vis.erase(*it);
				while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					one.erase(*it1);
					pre = *it1;
				}
				pre = *it;
				q.push(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	if(vis.size() || (edge[1].size() - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			//if(_k == k) break;
		}
		//if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				/*while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					pre = *it1;
					one.erase(*it1);
				}*/
				pre = *it;
				q.push(*it);
				vis.erase(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	int al = n - 1 - edge[1].size() + 1;
	if(vis.size() || (al - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

void dfs(int i)
{
	dbg(i);
	int pre = 0;
	for(int j = 0; j < edge[i].size(); j ++) {
		while(true) {
			auto it = vis.upper_bound(pre);
			if(it == vis.end()) break;
			if(*it >= edge[i][j]) break;
			pre = *it;
			vis.erase(*it);
			//q.push(*it);
			dfs(pre);
		}
		pre = edge[i][j];
	}
}

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif
	int n, m, u, v, k, _k, pre, c, i, j, prec;

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	dbg(34445);

	pre = _k = 0;
	for(i = 0; i < edge[1].size(); i ++) {
		while(true) {
			auto it = vis.upper_bound(pre);
			if(it == vis.end()) break;
			if(*it >= edge[1][i]) break;
			dbg(*it);
			pre = *it;
			vis.erase(*it);
			//q.push(*it);
			_k ++;
			dfs(pre);
		}
		pre = edge[1][i];
	}
	dbg(_k, k);
	if(_k > k) {
		dbg(1);
		printf("impossible\n");
		return 0;
	}
	if(n - edge[1].size() < k) {
		dbg(2);
		printf("impossible\n");
		return 0;
	}
	if(vis.size()) {
		dbg(3);
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j;
vector<int> edge[MX];
queue<int> q;
set<int> vis;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				vis.erase(*it);
				pre = *it;
				q.push(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	if(vis.size()) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			//if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				/*while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					pre = *it1;
					one.erase(*it1);
				}*/
				pre = *it;
				q.push(*it);
				vis.erase(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	int al = n - 1 - edge[1].size() + 1;
	if(vis.size() || (al - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j;
vector<int> edge[MX];
queue<int> q;
set<int> vis;
bool one[MX];

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one[c] = 1;
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			if(one[edge[i][j]]) {
				cnt ++;
				one[ edge[i][j] ] = 0;
			}
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				vis.erase(*it);
				pre = *it;
				q.push(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	if(vis.size() || (edge[1].size() - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					pre = *it1;
					one.erase(*it1);
				}
				pre = *it;
				q.push(*it);
				vis.erase(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	if(vis.size() || (edge[1].size() - cnt - 1 > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

void dfs(int i)
{
	dbg(i);
	int pre = 0;
	for(int j = 0; j < edge[i].size(); j ++) {
		while(true) {
			auto it = vis.upper_bound(pre);
			if(it == vis.end()) break;
			if(*it >= edge[i][j]) break;
			pre = *it;
			vis.erase(*it);
			//q.push(*it);
			dfs(*it);
		}
		pre = edge[i][j];
	}
}

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif
	int n, m, u, v, k, _k, pre, c, i, j, prec;

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	dbg(34445);

	pre = _k = 0;
	for(i = 0; i < edge[1].size(); i ++) {
		while(true) {
			auto it = vis.upper_bound(pre);
			if(it == vis.end()) break;
			if(*it >= edge[1][i]) break;
			dbg(*it);
			pre = *it;
			vis.erase(*it);
			//q.push(*it);
			_k ++;
			dfs(*it);
		}
		pre = edge[1][i];
	}
	dbg(_k, k);
	if(_k > k) {
		dbg(1);
		printf("impossible\n");
		return 0;
	}
	if(n - edge[1].size() < k) {
		dbg(2);
		printf("impossible\n");
		return 0;
	}
	if(vis.size()) {
		dbg(3);
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					pre = *it1;
					one.erase(*it1);
				}
				pre = *it;
				q.push(*it);
				vis.erase(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	int al = n - 1 - edge[1].size() + 1;
	if(vis.size() || (al - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 100007

int n, m, u, v, k, _k, pre, c, i, j;
vector<int> edge[MX];
queue<int> q;
bool vis[MX];

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) edge[i].PB(n + 1);

	pre = 0;
	vis[1] = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		for(c = pre + 1; c < edge[1][i]; c ++) {
			if(vis[c]) continue;
			q.push(c);
			vis[c] = 1;
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			dbg(i, edge[i][j]);
			for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}
			pre = edge[i][j];
		}
	}
	for(i = 1; i <= n; i ++) if(vis[i] == 0) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			//if(_k == k) break;
		}
		//if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					pre = *it1;
					one.erase(*it1);
				}
				pre = *it;
				q.push(*it);
				vis.erase(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	int al = n - 1 - edge[1].size() + 1;
	if(vis.size() || (al - cnt > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


/*
ID: kfoozminus
TASK:
LANG: C++
*/

#include <bits/stdc++.h>
using namespace std;
//typedefs
/*
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <int, pii> piii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef pair <ll, ll> pll;
const double PI = acos(-1);
*/
//typedefs
#define ll long long
#define ull unsigned long long
#define pii pair <int, int>
#define piii pair <int, pii>
#define vi vector <int>
#define vl vector <ll>
#define pll pair <ll, ll>
#define PI acos(-1)
//defines
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define mem(a, b) memset(a, b, sizeof(a))
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) (a*(b/gcd(a,b)))
#define SQR(a) ((a)*(a))
#define inf 100000000
#define mod 1000000007
#define mod1 1000000007
#define mod2 1000000009
#define b1 43
#define b2 41
#define EPS 1e-9
//define harmonic(n) 0.57721566490153286l+log(n)
#define nl puts("")
#define odd(n) ((n)&1)
#define even(n) (!((n)&1))
#define vsort(v) sort(v.begin(), v.end())
#define lc (node<<1)
#define rc ((node<<1)|1)
#define ran(a, b) ((((rand() << 15) ^ rand()) % ((b) - (a) + 1)) + (a))
//loop
#define rep(i, n) for(int i = 0; i < n; ++i)
#define REP(i, n) for(int i = 1; i <= n; ++i)
//input
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define sl(a) scanf("%lld", &a)
#define sll(a, b) scanf("%lld%lld", &a, &b)
#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)
#define sd(a) scanf("%lf", &a)
#define sc(a) scanf("%c", &a)
#define sst(a) scanf("%s", a)
inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
//debug
#ifdef kfoozminus

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
	return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
	os << "{";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << *it;
	}
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin()) os << ", ";
		os << *it;
	}
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
	os << "[";
	for(auto it = v.begin(); it != v.end(); ++it) {
		if( it != v.begin() ) os << ", ";
		os << it -> first << " = " << it -> second ;
	}
    return os << "]";
}

#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)

clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)

void faltu () { cerr << endl; }

template <typename T>
void faltu( T a[], int n ) {
	for(int i = 0; i < n; ++i) cerr << a[i] << ' ';
	cerr << endl;
}

template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

#else
#define dbg(args...)
#endif
/*
ll add(ll a, ll b) {
	ll ret = a+b;
	if(ret >= mod) ret -= mod;
	return ret;
}

ll subtract(ll a, ll b) {
	ll ret = a-b;
	if(ret < 0) ret += mod;
	return ret;
}

ll mult(ll a, ll b) {
	ll ret = a*b;
	if(ret >= mod) ret %= mod;
	return ret;
}

ll bigmod(ll a, ll b) {
	ll ret = 1;
	while(b) {
		if(b&1) ret = mult(ret, a);
		b >>= 1; a = mult(a, a);
	}
	return ret;
}
*/

//ll inverse(ll n) { return bigmod(n, mod-2); }

/*
#define PMX 1000000

int marked[PMX/64 + 2];
vi primes;

#define mark(x) marked[x >> 6] |= (1 << ((x & 63) >> 1))
#define check(x) (marked[x >> 6] & (1 << ((x & 63) >> 1)))

bool isPrime(int x)
{
	return (x > 1) && ((x == 2) || ((x & 1) && (!(check(x)))));
}

void seive(int n)
{
	int i, j;
	for(i = 3; i * i <= n; i += 2) if(!check(i)) for(j = i * i; j <= n; j += i << 1) mark(j);
	primes.PB(2);
	for(i = 3; i <= n; i += 2) if(isPrime(i)) primes.PB(i);
}
*/

//Direction Array
//int fx[]={1, -1, 0, 0}; int fy[]={0, 0, 1, -1};
//int fx[]={0, 0, 1, -1, -1, 1, -1, 1}; int fy[]={-1, 1, 0, 0, 1, 1, -1, -1};

//bit manipulation
/*
bool checkBit(int n, int i) { return (n&(1<<i)); }
int setBit(int n, int i) { return (n|(1<<i)); }
int resetBit(int n, int i) { return (n&(~(1<<i))); }
*/
//end of template

#define MX 300007

int n, m, u, v, k, _k, pre, c, i, j, prec;
vector<int> edge[MX];
queue<int> q;
set<int> vis, one;

int main () {
#ifdef kfoozminus
//	freopen("in", "r", stdin);
//	freopen("out", "w", stdout);
#endif

	scanf("%d %d %d", &n, &m, &k);
	while(m --) {
		scanf("%d %d", &u, &v);
		edge[u].PB(v);
		edge[v].PB(u);
	}
	for(i = 1; i <= n; i ++) {
		edge[i].PB(n + 1);
		if(i > 1) vis.insert(i);
		vsort(edge[i]);
	}

	pre = 1;
	for(i = 0; i < edge[1].size(); i ++) {
		dbg(i, edge[1][i]);
		for(c = pre + 1; c < edge[1][i]; c ++) {
			q.push(c);
			vis.erase(c);
			one.insert(c);
			dbg(c);
			_k ++;
			if(_k == k) break;
		}
		if(c < edge[1][i]) break;
		pre = edge[1][i];
	}
	if(_k < k) {
		printf("impossible\n");
		return 0;
	}

	int cnt = 0;

	while(q.empty() == 0) {
		i = q.front();
		q.pop();
		pre = 0;
		prec = 0;
		for(j = 0; j < edge[i].size(); j ++) {
			while(true) {
				auto it = vis.upper_bound(pre);
				if(it == vis.end()) break;
				if(*it >= edge[i][j]) break;
				vis.erase(*it);
				while(true) {
					auto it1 = one.upper_bound(pre);
					if(it1 == one.end()) break;
					if(*it1 >= *it) break;
					cnt ++;
					one.erase(*it1);
					pre = *it1;
				}
				pre = *it;
				q.push(*it);
				dbg(*it);
			}
			//dbg(i, edge[i][j]);
			/*for(c = pre + 1; c < edge[i][j]; c ++) {
				if(vis[c]) continue;
				dbg(i, c);
				q.push(c);
				vis[c] = 1;
			}*/
			pre = edge[i][j];
		}
	}
	if(vis.size() || (edge[1].size() - cnt - 1 > k)) {
		printf("impossible\n");
		return 0;
	}
	printf("possible\n");

//	timeStamp;
	return 0;
}


#include <bits/stdc++.h>
const int N=300005;
using std::make_pair;
int n,m,k,x,y,f[N],flag,vis[N],cnt;
std::unordered_map<int,int> e[N],s;
void dfs(int x){
	vis[x]=1;
	s.erase(x);
	if (!f[x]) flag=1;
	std::vector<int> t;
	t.clear();
	for (auto j:s){
		int u=j.first;
		if (e[x].find(u)==e[x].end())
			t.push_back(u);
	}
	for (int u:t)
		if (!vis[u]) dfs(u);
}
void Exit(){
	puts("impossible");
	exit(0);
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		if (x==1) f[y]=1;
		if (y==1) f[x]=1;
		e[x].insert(make_pair(y,1)),e[y].insert(make_pair(x,1));
	}
	int tot=n-1;
	for (int i=2;i<=n;i++) tot-=f[i];
	if (tot<k) Exit();
	for (int i=2;i<=n;i++) s.insert(make_pair(i,1));
	for (int i=2;i<=n;i++){
		if (vis[i]) continue;
		flag=0;
		cnt++,dfs(i);
		if (!flag) Exit();
	}
	if (cnt>k) Exit();
	else{
		puts("possible");
		return 0;
	}
}


#include <bits/stdc++.h>
const int N=300005;
using std::make_pair;
int n,m,k,x,y,f[N],flag,vis[N],cnt;
std::unordered_map<int,int> e[N],s;
std::queue<int> q;
void bfs(int S){
	q.push(S);
	vis[x]=1;
	while (!q.empty()){
		int x=q.front();
		if (!f[x]) flag=1;
		s.erase(x);
		q.pop();
		for (auto j:s){
			int u=j.first;
			if (e[x].find(u)!=e[x].end() || vis[u]==1) continue;
			vis[u]=1,q.push(u);
		}
	}
}
void Exit(){
	puts("impossible");
	exit(0);
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		if (x==1) f[y]=1;
		if (y==1) f[x]=1;
		e[x].insert(make_pair(y,1)),e[y].insert(make_pair(x,1));
	}
	int tot=n-1;
	for (int i=2;i<=n;i++) tot-=f[i];
	if (tot<k) Exit();
	for (int i=2;i<=n;i++) s.insert(make_pair(i,1));
	for (int i=2;i<=n;i++){
		if (vis[i]) continue;
		flag=0;
		cnt++,bfs(i);
		if (!flag) Exit();
	}
	if (cnt>k) Exit();
	else{
		puts("possible");
		return 0;
	}
}


#include <bits/stdc++.h>
const int N=300005;
using std::make_pair;
int n,m,k,x,y,f[N],flag,vis[N],cnt,rt[N];
std::unordered_map<int,int> e[N],s;
std::queue<int> q;
void bfs(int S){
	q.push(S);
	s.erase(S);
	vis[S]=1;
	while (!q.empty()){
		int x=q.front();
		if (!f[x]) flag=1;
		q.pop();
		int cnt=0;
		for (auto j:s){
			int u=j.first;
			if (e[x].find(u)!=e[x].end() || vis[u]==1) continue;
			vis[u]=1,q.push(u);
			rt[++cnt]=u;
		}
		for (int i=1;i<=cnt;i++) s.erase(rt[i]);
	}
}
void Exit(){
	puts("impossible");
	exit(0);
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		if (x==1) f[y]=1;
		if (y==1) f[x]=1;
		e[x].insert(make_pair(y,1)),e[y].insert(make_pair(x,1));
	}
	int tot=n-1;
	for (int i=2;i<=n;i++) tot-=f[i];
	if (tot<k) Exit();
	for (int i=2;i<=n;i++) s.insert(make_pair(i,1));
	for (int i=2;i<=n;i++){
		if (vis[i]) continue;
		flag=0;
		cnt++,bfs(i);
		if (!flag) Exit();
	}
	if (cnt>k) Exit();
	else{
		puts("possible");
		return 0;
	}
}


#include <bits/stdc++.h>
const int N=300005;
using std::make_pair;
int n,m,k,x,y,f[N],flag,vis[N],cnt;
std::unordered_map<int,int> e[N],s;
std::queue<int> q;
void bfs(int S){
	q.push(S);
	vis[S]=1;
	while (!q.empty()){
		int x=q.front();
		if (!f[x]) flag=1;
		s.erase(x);
		q.pop();
		for (auto j:s){
			int u=j.first;
			if (e[x].find(u)!=e[x].end() || vis[u]==1) continue;
			vis[u]=1,q.push(u);
		}
	}
}
void Exit(){
	puts("impossible");
	exit(0);
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		if (x==1) f[y]=1;
		if (y==1) f[x]=1;
		e[x].insert(make_pair(y,1)),e[y].insert(make_pair(x,1));
	}
	int tot=n-1;
	for (int i=2;i<=n;i++) tot-=f[i];
	if (tot<k) Exit();
	for (int i=2;i<=n;i++) s.insert(make_pair(i,1));
	for (int i=2;i<=n;i++){
		if (vis[i]) continue;
		flag=0;
		cnt++,bfs(i);
		if (!flag) Exit();
	}
	if (cnt>k) Exit();
	else{
		puts("possible");
		return 0;
	}
}


#include<bits/stdc++.h>
using namespace std;
set<pair<int,int> > S;
set<int> rem;
bool check(int x,int y)
{
	if(x>y)swap(x,y);
	return !S.count(make_pair(x,y));
}
void YES(){puts("possible");exit(0);}
void NO(){puts("impossible");exit(0);}
int n,m,k,cnt;
void dfs(int u)
{
	vector<int> V;
	for(int i:rem)if(check(u,i))V.push_back(i);
	for(int i:V)rem.erase(i);
	for(int i:V)dfs(i);
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1,u,v;i<=m;++i)
	{
		scanf("%d%d",&u,&v);
		if(u>v)swap(u,v);
		if(u==1)++cnt;
		S.insert(make_pair(u,v));
	}
	if(n-1-cnt<k)NO();else cnt=0;
	for(int i=2;i<=n;++i)rem.insert(i);
	for(int i=2;i<=n;++i)if(check(1,i)&&rem.count(i))
	{
		rem.erase(i);
		dfs(i);
		++cnt;
	}
	if(rem.empty()&&cnt<=k)YES();
	else NO();
	return 0;
}


#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
set<pair<int,int> > S;
set<int> rem;
bool check(int x,int y)
{
	if(x>y)swap(x,y);
	return !S.count(make_pair(x,y));
}
void YES(){puts("possible");exit(0);}
void NO(){puts("impossible");exit(0);}
int n,m,k,cnt;
void dfs(int u)
{
	vector<int> V;
	for(int i:rem)if(check(u,i))V.push_back(i);
	for(int i:V)rem.erase(i);
	for(int i:V)dfs(i);
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1,u,v;i<=m;++i)
	{
		scanf("%d%d",&u,&v);
		if(u>v)swap(u,v);
		if(u==1)++cnt;
		S.insert(make_pair(u,v));
	}
	if(n-cnt<k)NO();else cnt=0;
	for(int i=2;i<=n;++i)rem.insert(i);
	for(int i=2;i<=n;++i)if(check(1,i)&&rem.count(i))
	{
		dfs(i);
		++cnt;
	}
	if(cnt<=k)YES();
	else NO();
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
set<pair<int,int> > S;
set<int> rem;
bool check(int x,int y)
{
	if(x>y)swap(x,y);
	return !S.count(make_pair(x,y));
}
void YES(){puts("possible");exit(0);}
void NO(){puts("impossible");exit(0);}
int n,m,k,cnt;
void dfs(int u)
{
	vector<int> V;
	for(int i:rem)if(check(u,i))V.push_back(i);
	for(int i:V)rem.erase(i);
	for(int i:V)dfs(i);
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1,u,v;i<=m;++i)
	{
		scanf("%d%d",&u,&v);
		if(u>v)swap(u,v);
		if(u==1)++cnt;
		S.insert(make_pair(u,v));
	}
	if(n-cnt<k)NO();else cnt=0;
	for(int i=2;i<=n;++i)rem.insert(i);
	for(int i=2;i<=n;++i)if(check(1,i)&&rem.count(i))
	{
		rem.erase(i);
		dfs(i);
		++cnt;
	}
	if(rem.empty()&&cnt<=k)YES();
	else NO();
	return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FastIO      ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0)
#define pb          push_back
#define siz         100009
#define inf         1e9+8
#define mp          make_pair
#define rep(i,n)    for(int i=0;i<n;i++)
#define repo(i,m,n) for(int i=m;i<=n;i++)
#define ll          long long
#define pii         pair<int,int >
#define sc(n)       scanf("%d",&n)
#define sc2(m,n)    scanf("%d%d",&m,&n);
#define MOD         4294967296
#define fileout     freopen("output.txt","w",stdout)
#define filein      freopen("input.txt","r",stdin)
#define mem(x,i)    memset(x,i,sizeof x)
#define PI          acos(-1.0)
#define ff          first
#define ss          second
#define all(x)      x.begin(),x.end()
#define Case(t)     for(int ks=1;ks<=t;ks++)
/*------------------------------Graph Moves----------------------------*/
//const int fx[]={+1,-1,+0,+0};
//const int fy[]={+0,+0,+1,-1};
//const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1};   // Kings Move
//const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1};  // Kings Move
//const int fx[]={-2, -2, -1, -1,  1,  1,  2,  2};  // Knights Move
//const int fy[]={-1,  1, -2,  2, -2,  2, -1,  1}; // Knights Move
/*---------------------------------------------------------------------*/
using namespace __gnu_pbds;
using namespace std;
template <typename T>  using orderedSet =
    tree<T, null_type, less<T>,
    rb_tree_tag, tree_order_statistics_node_update>;//find_by_order,order_of_key

vector<pii>edge;
int n,m,k;
set<int>vis;
void DFS(int src)
{
    //cout<<src<<' ';
    vis.erase(src);
    vector<int>dd;
    for(int i:vis)
    {
        pii p={min(src,i),max(src,i)};
        if(!binary_search(edge.begin(),edge.end(),p))
        {
               dd.pb(i);
        }
    }
    for(int i:dd) vis.erase(i);
    for(int i:dd) DFS(i);
}
int main()
{
    FastIO;
    cin>>n>>m>>k;
    int has=n-1,is=0;
    rep(i,m)
    {
        int u,v;cin>>u>>v;
        if(u>v) swap(u,v);
        edge.pb({u,v});
        if(u==1) is++;
    }
    has-=is;
    if(has<k){cout<<"impossible\n";return 0;}
    sort(all(edge));
    repo(i,2,n) vis.insert(i);
    has=0;
    for(int i=2;i<=n;i++)
    {
        if(vis.count(i) && !binary_search(all(edge),make_pair(1,i)))
            {
                DFS(i);
                has++;
            }
    }
    //cout<<has<<endl;
    if(vis.size()) cout<<"impossible\n";
    else if(has>k) cout<<"impossible\n";
    else cout<<"possible\n";
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FastIO      ios_base::sync_with_stdio(0);cin.tie(0),cout.tie(0)
#define pb          push_back
#define siz         100009
#define inf         1e9+8
#define mp          make_pair
#define rep(i,n)    for(int i=0;i<n;i++)
#define repo(i,m,n) for(int i=m;i<=n;i++)
#define ll          long long
#define pii         pair<int,int >
#define sc(n)       scanf("%d",&n)
#define sc2(m,n)    scanf("%d%d",&m,&n);
#define MOD         4294967296
#define fileout     freopen("output.txt","w",stdout)
#define filein      freopen("input.txt","r",stdin)
#define mem(x,i)    memset(x,i,sizeof x)
#define PI          acos(-1.0)
#define ff          first
#define ss          second
#define all(x)      x.begin(),x.end()
#define Case(t)     for(int ks=1;ks<=t;ks++)
/*------------------------------Graph Moves----------------------------*/
//const int fx[]={+1,-1,+0,+0};
//const int fy[]={+0,+0,+1,-1};
//const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1};   // Kings Move
//const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1};  // Kings Move
//const int fx[]={-2, -2, -1, -1,  1,  1,  2,  2};  // Knights Move
//const int fy[]={-1,  1, -2,  2, -2,  2, -1,  1}; // Knights Move
/*---------------------------------------------------------------------*/
using namespace __gnu_pbds;
using namespace std;
template <typename T>  using orderedSet =
    tree<T, null_type, less<T>,
    rb_tree_tag, tree_order_statistics_node_update>;//find_by_order,order_of_key

vector<pii>edge;
int n,m,k;
set<int>vis;
void DFS(int src)
{
    vis.erase(src);
    vector<int>dd;
    for(int i:vis)
    {
        pii p={src,i};
        if(!binary_search(edge.begin(),edge.end(),p))
        {
               dd.pb(i);
        }
    }
    for(int i:dd) vis.erase(i);
    for(int i:dd) DFS(i);
}
int main()
{
    FastIO;
    cin>>n>>m>>k;
    int has=n-1,is=0;
    rep(i,m)
    {
        int u,v;cin>>u>>v;
        if(u>v) swap(u,v);
        edge.pb({u,v});
        if(u==1) is++;
    }
    has-=is;
    if(has<k){cout<<"impossible\n";return 0;}
    sort(all(edge));
    repo(i,1,n) vis.insert(i);
    has=0;
    for(int i=2;i<=n;i++)
    {
        if(vis.count(i) && !binary_search(all(edge),make_pair(1,i)))
            {
                DFS(i);
                has++;
            }
    }
    if(vis.size()) cout<<"impossible\n";
    else if(has>k) cout<<"impossible\n";
    else cout<<"possible\n";
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <random>
#include <time.h>
#include <queue>
#define int long long
using namespace std;
vector<set<int> > v;
set<int> unused;
int n, m, k;
void dfs(int vertex){
    auto it = unused.upper_bound(vertex-1);
    unused.erase(it);
    int last = -1;
    while (true){
        auto it = unused.upper_bound(last);
        if (it == unused.end()) break;
        int S = *it;
        last = S;
        if (v[vertex].count(S)) continue;
        dfs(S);
    }
}
signed main(){
    cin >> n >> m >> k;
    for (int i=0; i < n; i++){
        unused.insert(i);
        set<int> ms;
        v.push_back(ms);
    }
    for (int i=0; i < m; i++){
        int l, r;
        cin >> l >> r;
        l--; r--;
        v[l].insert(r);
        v[r].insert(l);
    }
    if (n - 1 - v[0].size() < k){
        cout << "impossible" << endl;
        return 0;
    }
    dfs(0);
    int unical = 0;
    for (int i=1; i < n; i++){
        if (v[i].size() == n-2 && !v[i].count(0)) unical++;
    }
    if (unused.size() == 0 && unical <= k) cout << "possible" << endl;
    else cout << "impossible" << endl;
    return 0;
}