#include <bits/stdc++.h>
using namespace std;
template <typename num_t>
inline void add_mod(num_t& a, const long long& b, const int& m) {
  a = (a + b) % m;
  if (a < 0) a += m;
}
template <typename num_t>
inline bool update_max(num_t& a, const num_t& b) {
  return a < b ? a = b, true : false;
}
template <typename num_t>
inline bool update_min(num_t& a, const num_t& b) {
  return a > b ? a = b, true : false;
}
template <typename num_t>
num_t gcd(num_t lhs, num_t rhs) {
  return !lhs ? rhs : gcd(rhs % lhs, lhs);
}
template <typename num_t>
num_t pw(num_t n, num_t k, num_t mod) {
  num_t res = 1;
  for (; k > 0; k >>= 1) {
    if (k & 1) res = 1ll * res * n % mod;
    n = 1ll * n * n % mod;
  }
  return res;
}
const int inf = 1e9 + 7;
const int mod = inf;
const long long ll_inf = 9ll * inf * inf;
const int MAX_N = 300000 + 7;
int n, m, k;
vector<int> adj[MAX_N];
int parent[MAX_N];
int depth[MAX_N];
int child[MAX_N];
void dfs(int u) {
  for (int v : adj[u])
    if (parent[v] == 0) {
      parent[v] = u;
      child[u]++;
      depth[v] = depth[u] + 1;
      dfs(v);
    }
}
vector<int> get_path(int child, int p) {
  vector<int> ans;
  while (child != parent[p]) {
    ans.push_back(child);
    child = parent[child];
  }
  return ans;
}
void solve() {
  cin >> n >> m >> k;
  for (int i = (0), _b = (m); i < _b; ++i) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  int root = 1;
  depth[root] = 1;
  parent[root] = -1;
  dfs(root);
  int mx_leaf = root;
  for (int i = 1; i <= n; ++i)
    if (depth[mx_leaf] < depth[i]) mx_leaf = i;
  if (depth[mx_leaf] * 1ll * k >= n) {
    cout << "PATH" << '\n';
    cout << depth[mx_leaf] << '\n';
    while (mx_leaf != -1) {
      cout << mx_leaf << ' ';
      mx_leaf = parent[mx_leaf];
    }
  } else {
    cout << "CYCLES\n";
    for (int i = 1; i <= n && k > 0; ++i)
      if (!child[i]) {
        vector<int> temp;
        for (int v : adj[i])
          if (v != parent[i]) temp.push_back(v);
        temp.resize(2);
        vector<int> ans;
        if (((depth[i] - depth[temp[0]] + 1) % 3) != 0) {
          ans = get_path(i, temp[0]);
        } else if (((depth[i] - depth[temp[1]] + 1) % 3) != 0) {
          ans = get_path(i, temp[1]);
        } else {
          if (depth[temp[0]] > depth[temp[1]])
            ans = get_path(temp[0], temp[1]);
          else
            ans = get_path(temp[1], temp[0]);
          ans.insert(ans.begin(), i);
        }
        cout << ans.size() << '\n';
        for (int x : ans) cout << x << ' ';
        cout << '\n';
        --k;
      }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  const bool multiple_test = false;
  int test = 1;
  if (multiple_test) cin >> test;
  for (int i = 0; i < test; ++i) {
    solve();
  }
}
