#include <bits/stdc++.h>
using namespace std;
set<int> edges[1000000];
set<int> rem;
int component[1000000];
set<int> comp_id;
void go(int id) {
  queue<int> bfs;
  bfs.push(id);
  component[id] = id;
  while (!bfs.empty()) {
    int u = bfs.front();
    bfs.pop();
    stack<int> st;
    for (auto v : rem) {
      if (edges[u].find(v) != edges[u].end()) continue;
      component[v] = id;
      bfs.push(v);
      st.push(v);
    }
    while (!st.empty()) {
      rem.erase(rem.find(st.top()));
      st.pop();
    }
  }
}
int main() {
  int n, m, k;
  scanf("%d", &n);
  scanf("%d", &m);
  scanf("%d", &k);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d", &u);
    scanf("%d", &v);
    edges[u].insert(v);
    edges[v].insert(u);
  }
  for (int i = 1; i <= n; i++) {
    if ((int)edges[i].size() == n - 1) {
      printf("impossible");
      return 0;
    }
  }
  for (int i = 2; i <= n; i++) rem.insert(i);
  int comp = 0;
  while (rem.begin() != rem.end()) {
    int node = *rem.begin();
    rem.erase(*rem.begin());
    go(node);
    comp++;
  }
  for (int i = 2; i <= n; i++)
    if (edges[1].find(i) == edges[1].end()) comp_id.insert(component[i]);
  if (comp > k) {
    printf("impossible");
    return 0;
  } else if (k > (n - 1 - (int)edges[1].size())) {
    printf("impossible");
    return 0;
  } else if ((int)comp_id.size() != comp) {
    printf("impossible");
    return 0;
  }
  printf("possible");
  return 0;
}
