#include <bits/stdc++.h>
using namespace std;
const int maxl = 2e5 + 10;
int n, m, ans, cas, k, tot, cnt, len;
int a[maxl], du[maxl];
int low[maxl], dep[maxl], fa[maxl], dis[maxl];
vector<int> e[maxl];
bool vis[maxl], in[maxl];
vector<int> b[maxl];
inline void dfs(int u) {
  vis[u] = true;
  b[u].push_back(u);
  for (int v : e[u]) {
    if (vis[v]) continue;
    fa[v] = u;
    dep[v] = dep[u] + 1;
    dfs(v);
  }
}
inline void prework() {
  scanf("%d%d", &n, &m);
  int u, v;
  len = sqrt(n);
  if (len * len < n) len++;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &u, &v);
    e[u].push_back(v);
    du[u]++;
    e[v].push_back(u);
    du[v]++;
  }
  dfs(1);
}
inline void dfs2(int u) {
  vis[u] = true;
  for (int v : e[u]) {
    if (vis[v]) continue;
    dfs2(v);
  }
  if (!in[u] && tot < len) {
    a[++tot] = u;
    for (int v : e[u]) in[v] = true;
  }
}
inline void mainwork() {
  dep[0] = maxl;
  for (int i = 1; i <= n; i++) {
    low[i] = i;
    for (int v : e[i])
      if (dep[v] < dep[low[i]]) low[i] = v;
    if (dep[i] - dep[low[i]] + 1 >= len) {
      ans = 2;
      int u = i;
      while (u != low[i]) {
        a[++tot] = u;
        u = fa[u];
      }
      a[++tot] = low[i];
      return;
    }
  }
  memset(vis, false, sizeof(vis[0]) * (n + 1));
  dfs2(1);
  ans = 1;
}
inline void print() {
  assert(ans != 0);
  if (ans == 1) {
    puts("1");
    for (int i = 1; i <= len; i++)
      printf("%d%c", a[i], (i == len) ? '\n' : ' ');
  } else {
    puts("2");
    printf("%d\n", tot);
    for (int i = 1; i <= tot; i++)
      printf("%d%c", a[i], (i == tot) ? '\n' : ' ');
  }
}
int main() {
  int t = 1;
  for (cas = 1; cas <= t; cas++) {
    prework();
    mainwork();
    print();
  }
  return 0;
}
