#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,c,f,root[N],idx;
vector<int> v;
struct node{
int a,b;
}stu[N];
struct nodee{
int l,r;
int cnt,sum;
}tree[N*25];
int read(){
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
int cmp(node x,node y){
return x.a<y.a;
}
int build(int l,int r){
int u=++idx;
if (l==r)
return u;
int mid=(l+r)>>1;
tree[u].l=build(l,mid);
tree[u].r=build(mid+1,r);
return u;
}
int insert(int p,int l,int r,int x){
int u=++idx;
tree[u]=tree[p];
if (l==r){
tree[u].cnt++;
tree[u].sum+=v[l];
return u;
}
int mid=(l+r)>>1;
if (x<=mid)
tree[u].l=insert(tree[u].l,l,mid,x);
else
tree[u].r=insert(tree[u].r,mid+1,r,x);
tree[u].cnt=tree[tree[u].l].cnt+tree[tree[u].r].cnt;
tree[u].sum=tree[tree[u].l].sum+tree[tree[u].r].sum;
return u;
}
int query(int p,int q,int l,int r,int k){
if (l==r)
return k*v[l];
int cnt=tree[tree[q].l].cnt-tree[tree[p].l].cnt;
int mid=(l+r)>>1;
int sum=0;
if (k<=cnt)
sum+=query(tree[p].l,tree[q].l,l,mid,k);
else{
sum+=tree[tree[q].l].sum-tree[tree[p].l].sum;
sum+=query(tree[p].r,tree[q].r,mid+1,r,k-cnt);
}
return sum;
}
int discrete(int x){
return lower_bound(v.begin(),v.end(),x)-v.begin();
}
int main(){
n=read(),c=read(),f=read();
int k=n/2;
for (int i=1;i<=c;i++){
stu[i].a=read(),stu[i].b=read();
v.push_back(stu[i].b);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
sort(stu+1,stu+1+c,cmp);
root[0]=build(0,v.size()-1);
for (int i=1;i<=c;i++){
root[i]=insert(root[i-1],0,v.size()-1,discrete(stu[i].b));
}
int ans=-1,anss,ansss;
for (int i=c-(n/2);i>=1+(n-1)/2;i--){
anss=query(root[0],root[i-1],0,v.size()-1,k);
ansss=query(root[i],root[c],0,v.size()-1,k);
// cout <<"anss:"<<anss<<" ansss:"<<ansss<<endl;
if (anss+ansss+discrete(stu[i].b)<=f)
ans=max(ans,stu[i].a);
if (ans!=-1)
break;
}
cout <<ans<<endl;
return 0;
}