#include <bits/stdc++.h>
#define INF 10000000000007LL
using namespace std;

typedef long long ll;
typedef pair<int,int> P;

int n,m,k;
vector<P> G[2005];
int data[2005][2005];
bool used[2005];
int dist[2005];
bool flagloop;
int cnt;
int num[2005];
int dp[2005][2005];

void dfs(int v,int p,int d){
	used[v]=true;
	for(int i=0;i<G[v].size();i++){
		if(!used[G[v][i].first]){
			dfs(G[v][i].first,v,d+1);
		}else{
			if(G[v][i].first!=p)flagloop=true;
		}
	}
	dist[v]=d;
}

int tmp[2005][2005][2];

void do_loop(int s){
	int len=1;
	int v=s,p=-1;
	tmp[0][0][0]=0;
	while(1){
		if(len==1){
			tmp[1][0][0]=0;
		}else{
			for(int i=0;i<G[v].size();i++){
				if(G[v][i].first==p){
					for(int j=0;j<=len;j++){
						if(G[v][i].second!=0){
							tmp[len][j+1][1]=max(tmp[len][j+1][1],tmp[len-1][j][1]+G[v][i].second);
						}
						tmp[len][j+1][1]=max(tmp[len][j+1][1],tmp[len-1][j][0]);
						tmp[len][j][0]=max(tmp[len][j][0],tmp[len-1][j][0]);
						tmp[len][j][0]=max(tmp[len][j][0],tmp[len-1][j][1]);
					}
				}
			}
		}
		if(G[v].size()==0)break;
		bool flag=false;
		for(int i=0;i<G[v].size();i++){
			if(G[v][i].first!=p && G[v][i].first!=s){
				flag=true;
				p=v;
				v=G[v][i].first;
				break;
			}
		}
		if(!flag)break;
		len++;
	}
	for(int i=0;i<=len;i++){
		for(int j=0;j<=len;j++){
			data[cnt][j]=max(tmp[i][j][0],data[cnt][j]);
			data[cnt][j]=max(tmp[i][j][1],data[cnt][j]);
		}
	}
	for(int i=0;i<=len;i++){
		for(int j=0;j<=len;j++){
			tmp[i][j][0]=-100000000;
			tmp[i][j][1]=-100000000;
		}
	}
	int goal=len;
	len=1;
	v=s,p=-1;
	tmp[0][0][0]=0;
	while(1){
		if(len==1){
			tmp[1][1][1]=0;
		}else if(goal==len){
			for(int i=0;i<=len;i++){
				if(G[v][0].second!=0 && G[v][1].second!=0){
					if(p!=s)tmp[len][i+1][1]=max(tmp[len][i+1][1],tmp[len-1][i][1]+G[v][0].second+G[v][1].second);
					else tmp[len][i+1][1]=max(tmp[len][i+1][1],tmp[len-1][i][1]+G[v][0].second);
				}
				if(G[v][0].first==s && G[v][0].second!=0){
					tmp[len][i+1][1]=max(tmp[len][i+1][1],tmp[len-1][i][0]+G[v][0].second);
				}
				if(G[v][1].first==s && G[v][1].second!=0){
					tmp[len][i+1][1]=max(tmp[len][i+1][1],tmp[len-1][i][0]+G[v][1].second);
				}
				tmp[len][i][0]=max(tmp[len][i][0],tmp[len-1][i][0]);
				tmp[len][i][0]=max(tmp[len][i][0],tmp[len-1][i][1]);
			}
		}else{
			for(int i=0;i<G[v].size();i++){
				if(G[v][i].first==p){
					for(int j=0;j<=len;j++){
						if(G[v][i].second!=0){
							tmp[len][j+1][1]=max(tmp[len][j+1][1],tmp[len-1][j][1]+G[v][i].second);
						}
						tmp[len][j+1][1]=max(tmp[len][j+1][1],tmp[len-1][j][0]);
						tmp[len][j][0]=max(tmp[len][j][0],tmp[len-1][j][0]);
						tmp[len][j][0]=max(tmp[len][j][0],tmp[len-1][j][1]);
					}
				}
			}
		}
		if(G[v].size()==0)break;
		bool flag=false;
		for(int i=0;i<G[v].size();i++){
			if(G[v][i].first!=p && G[v][i].first!=s){
				flag=true;
				p=v;
				v=G[v][i].first;
				break;
			}
		}
		if(!flag)break;
		len++;
	}

	for(int i=0;i<=len;i++){
		for(int j=0;j<=len;j++){
			data[cnt][j]=max(tmp[i][j][0],data[cnt][j]);
			data[cnt][j]=max(tmp[i][j][1],data[cnt][j]);
		}
	}
	for(int i=0;i<=len;i++){
		for(int j=0;j<=len;j++){
			tmp[i][j][0]=-100000000;
			tmp[i][j][1]=-100000000;
		}
	}

}

void do_notloop(int s){
	int len=1;
	int v=s,p=-1;
	tmp[0][0][0]=0;
	while(1){
		if(len==1){
			tmp[1][1][1]=0;
			tmp[1][0][0]=0;
		}else{
			for(int i=0;i<G[v].size();i++){
				if(G[v][i].first==p){
					for(int j=0;j<=len;j++){
						if(G[v][i].second!=0){
							tmp[len][j+1][1]=max(tmp[len][j+1][1],tmp[len-1][j][1]+G[v][i].second);
						}
						tmp[len][j+1][1]=max(tmp[len][j+1][1],tmp[len-1][j][0]);
						tmp[len][j][0]=max(tmp[len][j][0],tmp[len-1][j][0]);
						tmp[len][j][0]=max(tmp[len][j][0],tmp[len-1][j][1]);
					}
				}
			}
		}
		if(G[v].size()==0)break;
		bool flag=false;
		for(int i=0;i<G[v].size();i++){
			if(G[v][i].first!=p){
				flag=true;
				p=v;
				v=G[v][i].first;
				break;
			}
		}
		if(!flag)break;
		len++;
	}
	for(int i=0;i<=len;i++){
		for(int j=0;j<=len;j++){
			data[cnt][j]=max(tmp[i][j][0],data[cnt][j]);
			data[cnt][j]=max(tmp[i][j][1],data[cnt][j]);
		}
	}
	for(int i=0;i<=len;i++){
		for(int j=0;j<=len;j++){
			tmp[i][j][0]=-100000000;
			tmp[i][j][1]=-100000000;
		}
	}
}

int main(void){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=0;i<m;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		a--;
		b--;
		G[a].push_back(P(b,c));
		G[b].push_back(P(a,c));
	}
	cnt=0;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			data[i][j]=-100000000;
			dp[i][j]=-100000000;
			tmp[i][j][0]=-100000000;
			tmp[i][j][1]=-100000000;
		}
	}
	memset(used,false,sizeof(used));
	for(int i=0;i<n;i++){
		if(!used[i]){
			memset(dist,-1,sizeof(dist));
			flagloop=false;
			dfs(i,-1,0);
			int last=0;
			for(int j=0;j<n;j++){
				if(dist[last]<dist[j]){
					last=j;
				}
			}
			if(flagloop)do_loop(last);
			else do_notloop(last);
			cnt++;
		}
	}
	dp[0][0]=0;
	for(int i=0;i<cnt;i++){
		for(int j=0;j<=k;j++){
			if(dp[i][j]==-100000000)continue;
			for(int l=0;l+j<=k;l++){
				if(data[i][l]==-100000000)continue;
				dp[i+1][l+j]=max(dp[i+1][l+j],dp[i][j]+data[i][l]);
			}
		}
	}
	if(dp[cnt][k]<=-20000001){
		printf("Impossible\n");
	}else printf("%d\n",dp[cnt][k]);
	return 0;
}

Measured memory_bytes: 66064