#include <bits/stdc++.h>
using namespace std;
void addmod(int &a, long long b) {
  a = (a + b);
  if (a >= 1000000007) a -= 1000000007;
}
void mulmod(int &a, long long b) { a = (a * b) % 1000000007; }
int getint() {
  int a;
  scanf("%d", &a);
  return a;
}
long long getll() {
  long long a;
  scanf("%lld", &a);
  return a;
}
class graphal {
 public:
  int n;
  vector<set<int>> ed;
  graphal(const int &n) : n(n), ed(n) {}
  void add(int a, int b) {
    ed[a].insert(b);
    ed[b].insert(a);
  }
  void load(int m) {
    for (int i = 0; i < m; i++) {
      add(getint() - 1, getint() - 1);
    }
  }
  bool doit(int k) {
    queue<int> q;
    set<int> st;
    bool ok, done;
    int cnt = 0, ix, b;
    for (int i = 1; i < n; i++) {
      st.insert(i);
    }
    for (int i = 1; i < n; i++) {
      if (st.find(i) != st.end()) {
        ok = false;
        cnt++;
        q.push(i);
        st.erase(i);
        while (!q.empty()) {
          ix = q.front();
          if (!ok && ed[0].find(ix) == ed[0].end()) ok = true;
          q.pop();
          b = 0;
          done = false;
          while (!done) {
            auto it = st.upper_bound(b);
            if (it == st.end()) {
              done = true;
              continue;
            }
            b = (*it);
            if (ed[ix].find(b) != ed[ix].end()) continue;
            q.push(b);
            st.erase(b);
          }
        }
        if (!ok) return false;
      }
    }
    if (cnt > k) return false;
    int poss = n - 1 - ed[0].size();
    if (poss < k) return false;
    return true;
  }
};
int main() {
  int n = getint(), m = getint(), k = getint();
  graphal g(n);
  g.load(m);
  if (g.doit(k))
    printf("possible\n");
  else
    printf("impossible\n");
  return 0;
}
