#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
set<int> on, adj[300009];
void dfs(int nd) {
  vector<int> vec;
  for (typeof((on).begin()) it = (on).begin(); it != (on).end(); it++) {
    int u = *it, v = nd;
    if (u > v) swap(u, v);
    if (adj[u].find(v) == adj[u].end()) vec.push_back(*it);
  }
  for (typeof((vec).begin()) it = (vec).begin(); it != (vec).end(); it++)
    on.erase(*it);
  for (typeof((vec).begin()) it = (vec).begin(); it != (vec).end(); it++)
    dfs(*it);
}
int main() {
  int n, m, k, can = 0, comp = 0;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    if (u > v) swap(u, v);
    adj[u].insert(v);
    if (u == 1) can--;
  }
  if (can + (n - 1) < k) {
    printf("impossible\n");
    return 0;
  }
  for (int i = 2; i <= n; i++) on.insert(i);
  for (int i = 2; i <= n; i++)
    if (on.find(i) != on.end() and adj[1].find(i) == adj[1].end()) {
      comp++;
      dfs(i);
    }
  if (on.size() > 0 or comp > k) {
    printf("impossible\n");
    return 0;
  }
  printf("possible\n");
  return 0;
}
