#include <bits/stdc++.h>
using namespace std;
const int maxn = 250005;
int N, M, K, target;
vector<int> G[maxn], leaves;
int dept[maxn];
int par[maxn];
void print_path(int n) {
  vector<int> res;
  res.push_back(n);
  while (par[res.back()] != res.back()) res.push_back(par[res.back()]);
  cout << "PATH\n" << res.size() << "\n";
  for (int i : res) cout << i + 1 << " ";
  cout << endl;
}
void print_cycle() {
  cout << "CYCLES\n";
  for (int i = 0; i < K; ++i) {
    int n = leaves[i];
    for (int j = 0; j < 3; ++j) {
      vector<int> res[2];
      for (int jj = 0, k = 0; jj < 3; ++jj)
        if (jj != j) res[k++].push_back(G[n][jj]);
      if (dept[res[0][0]] < dept[res[1][0]]) swap(res[0], res[1]);
      while (dept[res[0].back()] > dept[res[1][0]])
        res[0].push_back(par[res[0].back()]);
      while (res[0].back() != res[1].back()) {
        res[0].push_back(par[res[0].back()]);
        res[1].push_back(par[res[1].back()]);
      }
      int len = res[0].size() + res[1].size();
      if (len % 3) {
        cout << len << "\n";
        cout << n + 1;
        res[0].pop_back();
        for (int ii : res[0]) cout << " " << ii + 1;
        for (auto iter = res[1].rbegin(); iter != res[1].rend(); ++iter)
          cout << " " << (*iter) + 1;
        cout << endl;
        break;
      }
    }
  }
}
void init() {
  int a, b;
  cin >> N >> M >> K;
  target = N / K + (N % K > 0);
  while (M--) {
    cin >> a >> b;
    --a, --b;
    G[a].push_back(b);
    G[b].push_back(a);
  }
}
void dfs(int n) {
  if (dept[n] >= target) {
    print_path(n);
    exit(0);
  }
  bool is_leaf = 1;
  for (int i : G[n]) {
    if (dept[i]) continue;
    is_leaf = 0;
    dept[i] = dept[n] + 1;
    par[i] = n;
    dfs(i);
  }
  if (is_leaf) leaves.push_back(n);
}
void sol() {
  dept[0] = 1;
  par[0] = 0;
  dfs(0);
  print_cycle();
}
int main() {
  ios::sync_with_stdio(false);
  init();
  sol();
}
