#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9, mod = 1e9 + 7;
const int N = 1e6 + 5;
int cur, bel[N], size[N], in[N], x, y, i, j, k, n, m, h[N];
set<int> S;
vector<int> v[N], ans[N];
vector<pair<int, int> > g[N];
int main() {
  scanf("%d %d %d", &n, &m, &k);
  in[1] = n - 1;
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &x, &y);
    v[x].push_back(y);
    v[y].push_back(x);
    in[x]--;
    in[y]--;
  }
  if (in[1] < k) {
    cout << "impossible" << '\n';
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    sort(v[i].begin(), v[i].end());
    int last = 0;
    for (__typeof(v[i].begin()) it = v[i].begin(); it != v[i].end(); it++) {
      g[i].push_back(make_pair(last, *it));
      last = *it + 1;
    }
    g[i].push_back(make_pair(last, inf));
  }
  for (int i = 2; i <= n; i++) S.insert(i);
  int G = 0;
  for (int i = 2; i <= n; i++) {
    if (h[i]) continue;
    queue<int> q;
    q.push(i);
    G++;
    S.erase(S.find(i));
    while (!q.empty()) {
      int node = q.front();
      q.pop();
      if (h[node]) continue;
      bel[node] = G;
      size[G]++;
      h[node] = 1;
      for (__typeof(g[node].begin()) it = g[node].begin(); it != g[node].end();
           it++) {
        while (1) {
          __typeof(S.begin()) it2 = S.lower_bound(it->first);
          if (it2 == S.end() || *it2 >= it->second) break;
          q.push(*it2);
          S.erase(it2);
        }
      }
    }
  }
  for (__typeof(v[1].begin()) it = v[1].begin(); it != v[1].end(); it++) {
    size[bel[*it]]--;
  }
  int cur = 0;
  for (int i = 1; i <= G; i++) cur += size[i] != 0;
  if (cur == G && cur <= k)
    cout << "possible\n";
  else
    cout << "impossible\n";
  return 0;
}
