import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
class Graph {
int N;
List> graph;
public Graph(int N) {
this.N = N;
graph = new ArrayList<>(N);
for(int i = 0; i < N; i++) {
graph.add(new ArrayList<>());
}
}
public void addEdge(int a, int b) {
graph.get(a).add(b);
graph.get(b).add(a);
}
public int countNumberOfCycles(int lengthOfCycle) {
int result = 0;
boolean[] visited = new boolean[N];
for(int i = 0; i < N; i++) {
result += dfs(i, i, 1, lengthOfCycle, visited);
visited[i] = true;
}
result /= 2;
return result;
}
private int dfs(int node, int startingNodeOfCycle, int currentLengthOfCycle, int cycleLength, boolean[] visited) {
if(currentLengthOfCycle == cycleLength) {
for(int i = 0; i < graph.get(node).size(); i++) {
if(graph.get(node).get(i) == startingNodeOfCycle) {
return 1;
}
}
return 0;
}
visited[node] = true;
int result = 0;
for(int i = 0; i < graph.get(node).size(); i++) {
int neighbour = graph.get(node).get(i);
if(!visited[neighbour]) {
result += dfs(neighbour, startingNodeOfCycle, currentLengthOfCycle + 1, cycleLength, visited);
}
}
visited[node] = false;
return result;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Graph g = new Graph(n);
for(int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
g.addEdge(a, b);
}
int cycleLength = sc.nextInt();
System.out.println(g.countNumberOfCycles(cycleLength));
}
}/*
5
6
0 1
0 2
1 2
2 3
2 4
3 4
3
*/