#include <bits/stdc++.h>
using namespace std;
const int inv = 1000000000;
const int minv = -inv;
const int max_n = 100000 + 5;
int n, m, k;
vector<int> adjl[max_n];
vector<int> lev[max_n];
int nlev;
int depth[max_n];
bool cyclefound;
pair<int, int> cycleparams;
int par[max_n];
bool visited[max_n];
vector<int> cycle;
vector<int> iset;
void DFS(int vt) {
  visited[vt] = true;
  lev[depth[vt]].push_back(vt);
  nlev = max(nlev, depth[vt] + 1);
  int nb;
  for (int i = 0; i < (int)adjl[vt].size(); ++i) {
    nb = adjl[vt][i];
    if (not visited[nb]) {
      depth[nb] = depth[vt] + 1;
      par[nb] = vt;
      DFS(nb);
    } else if (nb != par[vt] and (depth[nb] < depth[vt]) and
               (depth[vt] - depth[nb] < k) and (not cyclefound)) {
      cyclefound = true;
      cycleparams = pair<int, int>(vt, nb);
    }
  }
}
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  scanf("%d", &k);
  int u, v;
  for (int i = 0; i < m; ++i) {
    scanf("%d", &u);
    scanf("%d", &v);
    --u;
    --v;
    adjl[u].push_back(v);
    adjl[v].push_back(u);
  }
  fill(visited, visited + n, 0);
  depth[0] = 0;
  nlev = 0;
  for (int i = 0; i < n; ++i) lev[i].clear();
  par[0] = -1;
  cyclefound = false;
  DFS(0);
  if (cyclefound) {
    printf("%d\n", 2);
    cycle.clear();
    int vt = cycleparams.first;
    while (vt != cycleparams.second) {
      cycle.push_back(vt);
      vt = par[vt];
    }
    cycle.push_back(cycleparams.second);
    printf("%d\n", (int)cycle.size());
    for (int i = 0; i < (int)cycle.size(); ++i) printf("%d ", cycle[i] + 1);
    printf("\n");
    return 0;
  }
  printf("%d\n", 1);
  if (nlev >= k) {
    for (int i = 0; i < k; i += 2) printf("%d ", lev[i][0] + 1);
    printf("\n");
    return 0;
  }
  int ce = 0, co = 0;
  for (int i = 0; i < nlev; ++i)
    if (i & 1)
      co += (int)lev[i].size();
    else
      ce += (int)lev[i].size();
  int s = (ce < co ? 1 : 0);
  iset.clear();
  for (int i = s; i < nlev; i += 2)
    for (int j = 0; j < (int)lev[i].size(); ++j) iset.push_back(lev[i][j]);
  for (int i = 0; i < (k + 1) / 2; ++i) printf("%d ", iset[i] + 1);
  printf("\n");
  return 0;
}
