#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=500010;
const int MAX=1000000100;
const int mod=100000000;
const int MOD1=1000000007;
const int MOD2=1000000009;
const double EPS=0.00000001;
typedef long long ll;
const ll MOD=998244353;
const ll INF=10000000010;
typedef double db;
typedef unsigned long long ull;
char s[N][12];
int n,a[N],q[N],p[N],f[N],sum[N];
void deal(int n) {
int i,j,k=0;
f[1]=q[1]=1;
for (i=2;i<=n;i++) {
if (!q[i]) { f[i]=2;a[++k]=i; }
for (j=1;j<=k;j++) {
if (a[j]*i>n) break ;
q[a[j]*i]=1;f[a[j]*i]=2*f[i];
if (i%a[j]==0) {
f[a[j]*i]-=f[i/a[j]];break ;
}
}
}
}
void build(int x,int l,int r) {
if (l==r) { sum[x]=1;return ; }
int mid=(l+r)>>1;
build(2*x,l,mid);build(2*x+1,mid+1,r);
sum[x]=sum[2*x]+sum[2*x+1];
}
int query(int x,int l,int r,int k) {
if (l==r) return l;
int mid=(l+r)>>1;
if (sum[2*x]>=k) return query(2*x,l,mid,k);
return query(2*x+1,mid+1,r,k-sum[2*x]);
}
void updata(int x,int l,int r,int k) {
if (l==r) { sum[x]=0;return ; }
int mid=(l+r)>>1;
if (sum[2*x]>=k) updata(2*x,l,mid,k);
else updata(2*x+1,mid+1,r,k-sum[2*x]);
sum[x]=sum[2*x]+sum[2*x+1];
}
void add(int a,int b) {
for (;a<=n;a+=a&(-a)) p[a]+=b;
}
int getsum(int a) {
int ret=0;
for (;a;a-=a&(-a)) ret+=p[a];
return ret;
}
int main()
{
int i,m,k,w,mx,ans;
deal(500000);
memset(p,0,sizeof(p));
while (scanf("%d%d", &n, &k)!=EOF) {
for (i=1;i<=n;i++) scanf("%s%d", s[i], &a[i]);
ans=mx=0;m=n;build(1,1,n);
for (i=1;i<=n;i++) add(i,1);
for (i=1;i<=n;i++) {
w=query(1,1,n,k);updata(1,1,n,k);
if (f[i]>mx) { ans=w;mx=f[i]; }
add(w,-1);
if (a[w]>0) k=getsum(w)+a[w];
else k=getsum(w)+a[w]+1;
if (i==n) break ;
m--;k=((k-1)%m+m)%m+1;
}
printf("%s %d\n", s[ans], mx);
}
return 0;
}