#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 2.5e5;
vector<int> adj[N];
int dep[N], par[N];
bool leaf[N];
bool dfs(int u, int p = -1, int d = 1) {
  if (dep[u] > 0) return false;
  dep[u] = d;
  par[u] = p;
  leaf[u] = true;
  for (int v : adj[u]) {
    if (dfs(v, u, d + 1)) leaf[u] = false;
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(0);
  int r = 0;
  for (int u = 0; u < n; u++) {
    if (dep[u] > dep[r]) r = u;
  }
  dfs(r);
  const int plen = ((n + k - 1) / k);
  int leaves = 0;
  for (int u = 0; u < n; u++) {
    if (dep[u] >= plen) {
      cout << "PATH\n" << dep[u] << '\n';
      while (u != -1) {
        cout << (u + 1) << ' ';
        u = par[u];
      }
      cout << '\n';
      return 0;
    }
    if (leaf[u]) leaves++;
  }
  assert(leaves >= k);
  cout << "CYCLES\n";
  int values[3];
  vector<int> cy;
  cy.reserve(N);
  for (int u = 0; u < n && k > 0; u++) {
    if (!leaf[u]) continue;
    int top = -1;
    int id = 0;
    for (int v : adj[u]) {
      if (v == par[u]) continue;
      if ((dep[u] - dep[v]) >= 3 && (dep[u] - dep[v] + 1) % 3 != 0) {
        top = v;
        break;
      }
      values[id++] = v;
      if (id == 2) break;
    }
    if (top >= 0) {
      for (int v = u; v != top; v = par[v]) {
        cy.push_back(v);
      }
      cy.push_back(top);
    } else {
      cy.push_back(u);
      if (dep[values[0]] < dep[values[1]]) swap(values[0], values[1]);
      for (int v = values[0]; v != values[1]; v = par[v]) {
        cy.push_back(v);
      }
      cy.push_back(values[1]);
    }
    cout << cy.size() << '\n';
    for (int u : cy) cout << (u + 1) << ' ';
    cout << '\n';
    cy.clear();
    k--;
  }
  return 0;
}
