#include <bits/stdc++.h>
using namespace std;
template <class T, class T2>
inline bool chkmax(T &x, const T2 &y) {
  return x < y ? x = y, 1 : 0;
}
template <class T, class T2>
inline bool chkmin(T &x, const T2 &y) {
  return x > y ? x = y, 1 : 0;
}
const long long mod = 1e9 + 7;
template <class T>
inline void fix(T &x) {
  if (x >= mod | x <= -mod) {
    x %= mod;
  }
  if (x < 0) {
    x += mod;
  }
}
const int MAX_N = 1e5 + 10;
set<pair<int, int> > st;
int used[MAX_N], adj;
signed main() {
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    if (a == 1 || b == 1) {
      adj++;
    }
    st.insert({a, b});
    st.insert({b, a});
  }
  queue<int> q;
  q.push(1);
  set<int> nt;
  for (int i = 1; i <= n; i++) {
    nt.insert(i);
  }
  while (!q.empty()) {
    int curr = q.front();
    q.pop();
    vector<int> now;
    for (auto it : nt) {
      if (st.find({curr, it}) == st.end()) {
        now.push_back(it);
      }
    }
    for (auto it : now) {
      nt.erase(it);
      q.push(it);
    }
  }
  if (!nt.empty()) {
    cout << "impossible"
         << "\n";
    return 0;
  }
  for (int i = 2; i <= n; i++) {
    nt.insert(i);
  }
  long long ans = 0;
  for (int i = 2; i <= n; i++) {
    if (nt.find(i) != nt.end()) {
      q.push(i);
      while (!q.empty()) {
        int curr = q.front();
        q.pop();
        vector<int> now;
        for (auto it : nt) {
          if (st.find({curr, it}) == st.end()) {
            now.push_back(it);
          }
        }
        for (auto it : now) {
          nt.erase(it);
          q.push(it);
        }
      }
      ans++;
    }
  }
  if (ans <= k && k <= n - 1 - adj) {
    cout << "possible";
  } else {
    cout << "impossible";
  }
  return 0;
}
