#include <bits/stdc++.h>
using namespace std;
const int MN = 300010;
int N, M, K;
vector<int> adj[MN];
int chk[MN];
set<int> st;
queue<int> q;
vector<int> tmp;
int main() {
  scanf("%d %d %d", &N, &M, &K);
  for (int i = 0; i < M; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    u--;
    v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < N; i++) {
    sort(adj[i].begin(), adj[i].end());
  }
  if (N - 1 - (int)adj[0].size() < K) {
    printf("impossible");
    return 0;
  }
  for (int i = 0; i < adj[0].size(); i++) chk[adj[0][i]] = 1;
  int cnt = 0;
  for (int i = 1; i < N; i++) st.insert(i);
  for (int i = 1; i < N; i++) {
    if (st.find(i) == st.end()) continue;
    bool ok = false;
    q.push(i);
    st.erase(st.find(i));
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      if (!chk[u]) {
        ok = true;
      }
      tmp.clear();
      int pos = 0;
      for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
        while (pos < adj[u].size() && adj[u][pos] < *it) pos++;
        if (pos < adj[u].size() && adj[u][pos] == *it) continue;
        tmp.push_back(*it);
      }
      for (int j = 0; j < tmp.size(); j++) {
        q.push(tmp[j]);
        st.erase(st.find(tmp[j]));
      }
    }
    if (!ok) {
      printf("impossible");
      return 0;
    }
    cnt++;
  }
  if (cnt > K) {
    printf("impossible");
    return 0;
  }
  printf("possible");
}
