#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

int n, m, k;
struct edge{
	int u, v, w;
}Em[105];
int Lef[25];
int Rig[25];
int mx, mn, K=0;
bool cmp(edge a, edge b) {
	return a.w<b.w;
}

void init() {
	for(int i = 0; i < n; i++) {
		Lef[i] = 0;
		Rig[i] = 0;
	}
}

void dfs(int num, int t) {
	if(num == mx) K++;
	if(t == m) return ;
	if(num == mx) {
		K--;
		dfs(num, t+1);
	}
	else dfs(num, t+1);
	if(num+Em[t].w > mx && mx != mn) return ;
	if(Lef[Em[t].u] == 1 || Rig[Em[t].v] == 1) return ;
	if(num+Em[t].w > mn) {//大于最小的，更新最大的 
		if(num+Em[t].w > mx) {
			if(mx == mn) {//mx未更新 
				mx = num+Em[t].w;//仅更新一次 
				K = 0;
			}			
		}
		else if(num+Em[t].w < mx) {
			mx = num+Em[t].w;
			K = 0;
		}
	}
	Lef[Em[t].u] = 1;
	Rig[Em[t].v] = 1;
	dfs(num+Em[t].w, t+1);
	Lef[Em[t].u] = 0;
	Rig[Em[t].v] = 0;
}

int main() {
	int ans = 1;
	scanf("%d %d %d", &n, &m, &k);
	for(int i = 0; i < m; i++) {
		scanf("%d %d %d", &Em[i].u, &Em[i].v, &Em[i].w);
	}
	sort(Em, Em+m, cmp);
	mx = 0;
	while(1) {
		init();
		if(k == 1) break;
		mn = mx;
		dfs(0, 0);
		if(k > K) k-=K;
		else {
			ans = mx;
			break;
		}
	}
	printf("%d\n", ans);
	return 0;
}

/*
10 100 10000
1 1 1
1 2 2
1 3 3
1 4 4
1 5 5 
1 6 6 
1 7 7 
1 8 8 
1 9 9 
1 10 10
2 1 1
2 2 2
2 3 3 
2 4 4 
2 5 5 
2 6 6 
2 7 7 
2 8 8 
2 9 9 
2 10 10 
3 1 1 
3 2 2 
3 3 3 
3 4 4 
3 5 5 
3 6 6 
3 7 7 
3 8 8 
3 9 9 
3 10 10
4 1 1 
4 2 2 
4 3 3 
4 4 4 
4 5 5 
4 6 6 
4 7 7 
4 8 8 
4 9 9 
4 10 10
5 1 1 
5 2 2 
5 3 3 
5 4 4 
5 5 5 
5 6 6 
5 7 7 
5 8 8 
5 9 9 
5 10 10
6 1 1 
6 2 2 
6 3 3 
6 4 4 
6 5 5 
6 6 6 
6 7 7 
6 8 8 
6 9 9 
6 10 10
7 1 1 
7 2 2 
7 3 3 
7 4 4 
7 5 5 
7 6 6 
7 7 7 
7 8 8 
7 9 9 
7 10 10
8 1 1 
8 2 2 
8 3 3 
8 4 4 
8 5 5 
8 6 6 
8 7 7 
8 8 8 
8 9 9 
8 10 10
9 1 1 
9 2 2 
9 3 3 
9 4 4 
9 5 5 
9 6 6 
9 7 7 
9 8 8 
9 9 9 
9 10 10
10 1 1 
10 2 2 
10 3 3 
10 4 4 
10 5 5 
10 6 6 
10 7 7 
10 8 8 
10 9 9 
10 10 10

*/