#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,m,k;
const int maxn=30000;
int fa[maxn],v[maxn],c[maxn];
int find(int x){
if(fa[x]==x) return x;
else fa[x]=find(fa[x]);
return fa[x];
}
void sh(int x,int y){
int rx=find(x);
int ry=find(y);
if(rx!=ry)
fa[ry]=rx;//如果两个点不在一棵树内,那么吧x这个树的跟节点给挂到y这个树的根节点上面
}
void first(int n){
for(int i=1;i<=n;i++)
fa[i]=i;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
first(n);
for(int i=1,a,b;i<=k;i++){
scanf("%d%d",&a,&b);
sh(a,b);
}
for(int i=1;i<=n;i++) fa[i]=find(i);
sort(fa+1,fa+n+1);//排序
int cnt=1,x=find(1);
v[cnt]=1;
for(int i=2;i<=n;i++)//统计并查集个数
if(fa[i]==x) v[cnt]++;
else{
v[++cnt]++;
x=fa[i];
}
for(int i=1;i<=cnt;i++)//减少时间
for(int j=m*2;j>=v[i];j--)
c[j]=max(c[j],c[j-v[i]]+v[i]);
int m1,m2;
//for(int i=m;i>=0;i--)
//if(c[i]==i) {m1=abs(m-i);break;}
m1=m-c[m]; //少循环一遍
for(int i=m+1;i<=2*m;i++)
if(c[i]==i) {m2=abs(m-i);break;}
if(m1<=m2) printf("%d\n",m-m1);//输出绝对值较小者
else printf("%d\n",m+m2);
return 0;
}