#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
const long long infll = 0x7fffffffffffffff;
const int mod = (int)(1e9) + 7;
const int inf = 0x7fffffff;
const int maxn = (int)(2e5) + 7;
const int maxm = 300;
int n, m, k;
int hd[maxn], cnt;
int stk[maxn], p[maxn], tp;
vector<int> se[2];
struct edge {
  int to, nxt;
} e[maxn << 1];
void add(int u, int v) {
  e[++cnt] = {v, hd[u]};
  hd[u] = cnt;
}
void dfs(int now, int pre) {
  stk[++tp] = now;
  p[now] = tp;
  se[tp & 1].push_back(now);
  for (int i = hd[now]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (to == pre) continue;
    if (!p[to])
      dfs(to, now);
    else if ((p[now] - p[to] + 1 >= 3) && (p[now] - p[to] + 1 <= k)) {
      puts("2");
      printf("%d\n", p[now] - p[to] + 1);
      for (int j = p[to]; j <= p[now]; j++) printf("%d ", stk[j]);
      exit(0);
    }
  }
  stk[tp--] = 0;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  dfs(1, 0);
  puts("1");
  int al = (1 + k) >> 1;
  if ((int)((se[0]).size()) >= al)
    for (int i = 0; i < al; i++) printf("%d ", se[0][i]);
  else
    for (int i = 0; i < al; i++) printf("%d ", se[1][i]);
  return 0;
}
