#include <bits/stdc++.h>
using namespace std;
int p[300001];
vector<int> g[300001];
set<int> l, nx;
bool vis[300001];
int P(int v) {
  if (p[v]) return p[v] = P(p[v]);
  return v;
}
void an(bool win) {
  if (win)
    printf("possible\n");
  else
    printf("impossible\n");
  exit(0);
}
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 2; i < (int)(n + 1); ++i) nx.insert(i);
  for (int i = 0; i < (int)(m); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    g[a].push_back(b);
    g[b].push_back(a);
  }
  stack<int> st;
  for (int i = 2; i < (int)(n + 1); ++i) st.push(i);
  while (!st.empty()) {
    int v = st.top();
    st.pop();
    if (vis[v]) continue;
    vis[v] = true;
    sort(g[v].begin(), g[v].end());
    int x = P(v);
    for (set<int>::iterator it = nx.begin(); it != nx.end();)
      if (!binary_search(g[v].begin(), g[v].end(), *it)) {
        if (v != *it) p[*it] = x, st.push(*it);
        nx.erase(it++);
      } else
        ++it;
  }
  for (int i = 2; i < (int)(n + 1); ++i) l.insert(P(i));
  if (l.size() > k) an(false);
  vector<int> &e = g[1];
  sort(e.begin(), e.end());
  for (int i = 2; i < (int)(n + 1); ++i)
    if (!binary_search(e.begin(), e.end(), i)) {
      int u = P(i);
      --k;
      l.erase(u);
    }
  if (!l.empty() || k > 0) an(false);
  an(true);
}
