#include <bits/stdc++.h>
jmp_buf env;
std::vector<int> node[262144];
int p[262144], d[262144];
int n, m, k, th;
int path;
int cycs[262144], nc;
void dfs(int u, int _d = 1) {
  if ((d[u] = _d) == th) path = u, longjmp(env, 1);
  bool f = true;
  for (auto v : node[u])
    if (!d[v]) f = false, p[v] = u, dfs(v, _d + 1);
  if (f)
    if (cycs[nc++] = u, nc == k) longjmp(env, 2);
}
int main() {
  scanf("%d%d%d", &n, &m, &k), th = (n + k - 1) / k;
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    node[u].push_back(v);
    node[v].push_back(u);
  }
  int res;
  if (!(res = setjmp(env))) dfs(1), assert(false);
  if (res == 1) {
    puts("PATH");
    printf("%d\n", th);
    int t = th;
    for (int u = path; u; u = p[u]) assert(t), printf(--t ? "%d " : "%d\n", u);
    assert(t == 0);
  } else {
    assert(res == 2);
    puts("CYCLES");
    assert(nc == k);
    while (nc) {
      int o = cycs[--nc], u = 0, v = 0;
      for (auto t : node[o])
        if (d[o] - d[t] > 2 && (d[o] - d[t] + 1) % 3 != 0) {
          u = t;
          break;
        }
      if (!u) {
        for (auto t : node[o])
          if (t != p[o]) {
            if (!u) {
              u = t;
              continue;
            }
            v = t;
            break;
          }
        if (d[v] < d[u]) std::swap(u, v);
      } else
        v = p[o];
      printf("%d\n", d[v] - d[u] + 2);
      printf("%d", o);
      for (int k = v; k != p[u]; k = p[k]) printf(" %d", k);
      printf("\n");
    }
  }
  return 0;
}
