#include<vector>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<complex>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define mp make_pair
#define fi first
#define se second
const double pi = acos(-1);

typedef complex<double> P;
typedef vector<P> vp;
const double eps = 1e-10;
#define EQ(a,b)  (abs((a)-(b)) < eps)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

class st{
public:
  double arg,dist;
  P a;
  int index;
  bool operator<(const st & b)const{
    if (!(EQ(arg,b.arg)))return arg < b.arg;
    return dist < b.dist;
  }
};

pair<P,P> CC_intersection(P a,P b,double r1,double r2){//
  //cout <<"Cir a " << a <<" " << r1 << " Cir b " << b <<" " << r2 << endl;
 double l,m,n;
 double d = abs(a-b);
 double x,y;
 double p,q;
 l=(d*d-r2*r2+r1*r1)/(2*d);
 
 x=a.real()+(b.real()-a.real())*l/d;
 y=a.imag()+(b.imag()-a.imag())*l/d;
 
 n=sqrt(r1*r1-l*l);
 
 p=(b.imag()-a.imag())/d*n;
 q=(b.real()-a.real())/d*n;
 
 return mp(P(x+p,y-q),P(x-p,y+q));
}

void rotate(vp &a,P &ori,double theta){
  rep(i,a.size()){
    P tmp=a[i]-ori;
    double c=cos(theta),s=sin(theta);
    a[i].real()=c*tmp.real()-s*tmp.imag();
    a[i].imag()=s*tmp.real()+c*tmp.imag();
    a[i]+=ori;
  }
}
double cross(P a,P b){
 return a.real()*b.imag()-a.imag()*b.real();
}

int ccw(P a,P b){
   if ( cross(a,b) <0)return 1;
   else return -1;
}

bool cmp(const P&a,const P&b){
 if ( a.real() != b.real())return a.real()<b.real();
 else return a.imag() < b.imag();
}

vector<P> ConvexHull(int n,vp inp,int &p){
  P out[n];
  sort(inp.begin(),inp.end(),cmp);
  bool used[n];
  int num[n];
  fill(used,used+n,false);
  p=0;
  out[p++]=inp[0];out[p++]=inp[1];
  used[1]=true;
  num[0]=0;num[1]=1;
  for(int i=2;i<n;i++){
    while(p>=2){
      if ( ccw(out[p-1]-out[p-2],inp[i]-out[p-2]) ==1)break;
      else {
	used[num[p-1]]=false;
	p--;
      }
    }
    num[p]=i;
    used[i]=true;
    out[p++]=inp[i];
  }
  for(int i=n-2,t=p+1;i>=0;i--){
    if ( used[i] == true)continue;
    while(p>=t){//
      if ( ccw(out[p-1]-out[p-2],inp[i]-out[p-2]) ==1)break;
      else p--;
    }
    out[p++]=inp[i];
  }
  vp ret;
  rep(i,p-1)ret.push_back(out[i]);
  return ret;
}

void solve(double r,vp &in,int q,P &on){
  //cout <<"hoge " << on << endl;
  P ori(0,0);
  P prev=on;
  rep(k,q){
    //find the shortest data
    st mini=(st){1e300,1e300,on,-1};
    rep(i,(int)in.size()){
      if (EQV(in[i],on))continue;
      pair<P,P> inter=CC_intersection(on,ori,abs(in[i]-on),r);
      pair<double,double> carg=mp(arg(inter.fi-on)-arg(in[i]-on),
				  arg(inter.se-on)-arg(in[i]-on));
      if (carg.fi < 0)carg.fi+=2*pi;
      if (carg.se < 0)carg.se+=2*pi;
      st tmp;
      if (cross(inter.fi-on,inter.se-on)<0)tmp=(st){carg.fi,abs(inter.fi-on),in[i],i};
      else tmp=(st){carg.se,abs(inter.se-on),in[i],i};
      if (tmp < mini)mini=tmp;
    }
    prev=on;
    rotate(in,prev,mini.arg);
    printf("%.10lf %.10lf\n",in[mini.index].real(),in[mini.index].imag());
    on=in[mini.index];
  }
}

main(){
  int n,r,q;
  while(cin>>n>>r>>q && n){
    vp in(n);
    P on;
    rep(i,n){
      cin>>in[i].real()>>in[i].imag();
      if (EQ(abs(in[i]),r))on=in[i];
    }
    int p=0;
    in=ConvexHull(in.size(),in,p);
    /*
    cout << n<<" " << in.size() << endl;
    cout <<"[";
    rep(i,in.size()){
      cout << in[i] <<",";
    }
    cout <<in[0]<<",";
    cout <<"],"<<endl;
    */
    solve(r,in,q,on);
  }
  return false;
}

Measured memory_bytes: 1008