#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
long long MOD = 1000000007;
long double EPS = 1e-9;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int getRand(int l, int r) {
  uniform_int_distribution<int> uid(l, r);
  return uid(rng);
}
long long binpow(long long b, long long p, long long mod) {
  long long ans = 1;
  b %= mod;
  for (; p; p >>= 1) {
    if (p & 1) ans = ans * b % mod;
    b = b * b % mod;
  }
  return ans;
}
void pre() {}
struct UnionFind {
  int n, set_size, *parent, *rank;
  UnionFind() {}
  UnionFind(int a) {
    n = set_size = a;
    parent = new int[n + 1];
    rank = new int[n + 1];
    for (int i = 1; i <= n; ++i) parent[i] = i, rank[i] = 1;
  }
  int find(int x) {
    if (x != parent[x]) return parent[x] = find(parent[x]);
    return x;
  }
  void merge(int x, int y) {
    int xroot = find(x), yroot = find(y);
    if (xroot != yroot) {
      if (rank[xroot] >= rank[yroot]) {
        parent[yroot] = xroot;
        rank[xroot] += rank[yroot];
      } else {
        parent[xroot] = yroot;
        rank[yroot] += rank[xroot];
      }
      set_size -= 1;
    }
  }
  void reset() {
    set_size = n;
    for (int i = 1; i <= n; i++) parent[i] = i, rank[i] = 1;
  }
  int size() { return set_size; }
  void print() {
    for (int i = 1; i <= n; ++i) cout << i << " -> " << parent[i] << "\n";
  }
} uf(300300);
int n, m, k;
map<pair<int, int>, int> blocked;
set<int> unvisited;
void dfs(int tt) {
  vector<long long> deleter;
  for (auto v : unvisited) {
    if (blocked.find(make_pair(tt, v)) == blocked.end()) {
      deleter.emplace_back(v);
      uf.merge(tt, v);
    }
  }
  for (auto v : deleter) {
    unvisited.erase(v);
  }
  for (auto v : deleter) {
    dfs(v);
  }
}
void solve() {
  int n, m, k, kk;
  cin >> n >> m >> kk;
  k = kk;
  int onedeg = n - 1;
  for (long long i = 1; i <= m; ++i) {
    int u, v;
    cin >> u >> v;
    blocked[make_pair(u, v)] = 1;
    blocked[make_pair(v, u)] = 1;
    if (u == 1 || v == 1) onedeg--;
  }
  for (long long i = 2; i <= n; ++i) {
    unvisited.insert(i);
  }
  int cmp = 0;
  while (!unvisited.empty()) {
    int stt = *(unvisited.begin());
    unvisited.erase(stt);
    dfs(stt);
  }
  for (long long i = 2; i <= n; ++i) {
    if (k && uf.find(1) != uf.find(i) &&
        blocked.find(make_pair(1, i)) == blocked.end()) {
      k--;
      uf.merge(1, i);
    }
  }
  bool pos = 1;
  for (long long i = 2; i <= n; ++i) {
    if (uf.find(1) != uf.find(i)) pos = 0;
  }
  if (pos && onedeg >= kk)
    cout << "possible\n";
  else
    cout << "impossible\n";
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  pre();
  long long t = 1;
  for (long long i = 1; i <= t; i++) {
    solve();
  }
}
