#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
const int maxn=1001;

int n,m,k;
vector<int> sd[maxn];
int rd[maxn],rt;

bool vis[maxn];
vector<pair<int,bool> > wu;

void biu(int u,int v) {
	sd[u].pb(v); sd[v].pb(u);
}
void init() {
	FOR (i,1,n) {
		rd[i]=0;
		vis[i]=0;
		sd[i].clear();
	}
	wu.clear();
}

bool flag;
int dfs(int u,int fa) {
	vis[u]=1;
	for (int e=sd[u].size()-1,v;~e;e--) if ((v=sd[u][e])!=fa) {

		//if (v==rt) flag=1;  //--  v是第一个点的时候，和rt也是相连的...
		if (v==rt) {
			flag=1;
			break;
		}

		return dfs(v,u)+1;
	}
	return 1;
}

int cal(int dis0) {
	int ret=0;
	int lack=1,abun=0;
	int dis=2*dis0+1;
	for (int i=0;i<wu.size();i++) {
		int t=wu[i].first;
		if (!wu[i].second) {  //链
			ret+=t/dis; t%=dis;
			if (t>=dis0+1) {
				ret++; abun=max(abun,dis-t);
			}
			else {
				lack=max(lack,t+1);
			}
		}
		else {  //环
			ret+=t/dis; t%=dis;
			lack=max(lack,(t+1)/2+1);
		}
	}
	if (lack>abun) ret++;
	return ret;
}
int solve() {
	int l=0,r=n,mid;
	while (l<=r) {
		mid=l+r>>1;
		if (cal(mid)<=k) r=mid-1;
		else l=mid+1;
	}
	return l;
}
int main() {
	for (;~scanf("%d%d%d",&n,&m,&k);) {
		init();

		for (int i=1,u,v;i<=m;i++) {
			scanf("%d%d",&u,&v);
			biu(u,v); rd[u]++,rd[v]++;
		}
		rt=1;
		for (int i=1;i<=n;i++)
			if (rd[i]>=3) { rt=i; break; }


		vis[rt]=1;
		for (int e=sd[rt].size()-1,v;~e;e--) {
			v=sd[rt][e];
			if (vis[v]) continue;  //--

			flag=0;
			int tmp=dfs(v,rt);
			wu.pb(mp(tmp,flag));
		}

		printf("%d\n",solve());
	}
	return 0;
}

