#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char ch = getchar();
  bool f = false;
  while (!isdigit(ch)) {
    if (ch == '-') {
      f = true;
    }
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  x = f ? -x : x;
  return;
}
template <typename T>
inline void write(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 ^ 48);
  return;
}
template <typename T>
inline void print(T x) {
  write(x), putchar(' ');
}
const int N = 3e5 + 5, M = 1e6 + 5, MOD = 1e9 + 7;
int n, m, k, to;
unordered_set<int> now, inv[N];
vector<int> vec;
bool vis[N];
bool bfs(int st) {
  queue<int> q;
  bool flag = true;
  q.push(st);
  vis[st] = true;
  vec.clear();
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (auto v : now) {
      if (!vis[v] && !inv[x].count(v) && v != x) {
        vec.push_back(v);
        vis[v] = true;
        q.push(v);
      }
    }
    if (!inv[x].count(1)) flag = false;
    for (auto v : vec) now.erase(v);
    vec.clear();
  }
  return flag;
}
int main() {
  read(n), read(m), read(k);
  to = n - 1;
  for (int i = 2; i <= n; i++) now.insert(i);
  for (int i = 1; i <= m; i++) {
    int u, v;
    read(u), read(v);
    inv[u].insert(v);
    inv[v].insert(u);
    if (u == 1 || v == 1) to--;
  }
  if (to < k) {
    puts("impossible");
    return 0;
  }
  for (int i = 2; i <= n; i++) {
    if (!vis[i] && now.count(i)) {
      if (bfs(i)) {
        puts("impossible");
        return 0;
      }
    }
  }
  if (now.size() > k)
    puts("impossible");
  else
    puts("possible");
  return 0;
}
