#include <bits/stdc++.h>
int n, m, k;
struct dat {
  int leaf, par1, par2, size;
};
std::vector<int> v[250005];
int par[250005], ord[250005], h[250005];
std::vector<dat> cycles;
int done, ordcnt;
void dfs(int pos, int prev, int lv) {
  ord[pos] = ++ordcnt;
  par[pos] = prev;
  h[pos] = lv;
  if (lv * k >= n) {
    done = pos;
  }
  int child = 0;
  for (int next : v[pos]) {
    if (ord[next]) continue;
    child++;
    dfs(next, pos, lv + 1);
  }
  if (!child) {
    std::vector<int> back;
    for (int next : v[pos]) {
      if (next == prev) continue;
      back.push_back(next);
      if (back.size() == 2) break;
    }
    if ((h[pos] - h[back[0]]) % 3 != 2)
      cycles.push_back({pos, back[0], -1, (h[pos] - h[back[0]] + 1)});
    else if ((h[pos] - h[back[1]]) % 3 != 2)
      cycles.push_back({pos, back[1], -1, (h[pos] - h[back[1]] + 1)});
    else {
      if (h[back[0]] < h[back[1]]) std::swap(back[0], back[1]);
      cycles.push_back({pos, back[0], back[1], h[back[0]] - h[back[1]] + 2});
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  dfs(1, 0, 1);
  int pos;
  if (done) {
    puts("PATH");
    pos = done;
    printf("%d\n", h[pos]);
    while (pos) {
      printf("%d ", pos);
      pos = par[pos];
    }
  } else {
    puts("CYCLES");
    for (int i = 0; i < k; i++) {
      auto ans = cycles[i];
      printf("%d\n", ans.size);
      if (ans.par2 == -1) {
        pos = ans.leaf;
        while (pos != ans.par1) {
          printf("%d ", pos);
          pos = par[pos];
        }
        printf("%d\n", pos);
      } else {
        printf("%d ", ans.leaf);
        pos = ans.par1;
        while (pos != ans.par2) {
          printf("%d ", pos);
          pos = par[pos];
        }
        printf("%d\n", ans.par2);
      }
    }
  }
}
