#include <bits/stdc++.h>
using namespace std;
const int N = 300502;
int n, m, a, b, x, h, t, k;
vector<int> nbs[N];
int s[N];
int cs[N];
int up[N];
vector<int> roots;
int find(int x) {
  if (up[x] == x) return x;
  return up[x] = find(up[x]);
}
void join(int a, int b) {
  a = find(a);
  b = find(b);
  if (s[a] < s[b]) swap(a, b);
  up[b] = a;
  s[a] += s[b];
}
void fix(int& x) { x = (n - 1) - x; }
void solve() {
  cin >> n >> m >> k;
  for (int i = 0; i < (int)m; i++) {
    cin >> a >> b;
    --a;
    --b;
    fix(a);
    fix(b);
    nbs[a].push_back(b);
    nbs[b].push_back(a);
  }
  int root_degree = (n - 1) - nbs[n - 1].size();
  bool ok = true;
  ok &= (root_degree >= k);
  for (int i = 0; i < (int)n; i++) {
    up[i] = i;
    s[i] = 1;
    for (int j = 0; j < (int)roots.size(); j++) {
      int r = roots[j];
      cs[r] = 0;
    }
    for (int j = 0; j < (int)nbs[i].size(); j++) {
      int w = nbs[i][j];
      if (w < i) cs[find(w)]++;
    }
    if (i == n - 1) ok &= (roots.size() <= k);
    for (int j = 0; j < (int)roots.size(); j++) {
      int r = roots[j];
      if (cs[r] < s[r]) {
        join(i, r);
      }
    }
    vector<int> newroots;
    for (int j = 0; j < (int)roots.size(); j++) {
      int r = roots[j];
      if (up[r] == r) newroots.push_back(r);
    }
    roots = newroots;
    if (up[i] == i) roots.push_back(i);
  }
  ok &= (roots.size() == 1);
  cout << (ok ? "possible" : "impossible") << endl;
}
int main() {
  ios_base::sync_with_stdio(0);
  solve();
  return 0;
}
