#include <cstdio>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>

using namespace std;

#define EPS (1e-7)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

typedef complex<double> P;
typedef pair<P,P> Edge;
typedef long long ll;

const double PI=4*atan(1.0);
const int MAX_SIZE = 10000;

// 内積
double dot(P a, P b) {
  return (a.real() * b.real() + a.imag() * b.imag());
}
// 外積
double cross(P a, P b) {
  return (a.real() * b.imag() - a.imag() * b.real());
}
// 点cが直線ab上にあるかないか
int is_point_on_line(P a, P b, P c) {
  return EQ( cross(b-a, c-a), 0.0 );
}
// 2直線の直行判定
int is_orthogonal(P a1, P a2, P b1, P b2) {
  return EQ( dot(a1-a2, b1-b2), 0.0 );
}
// 2直線の平行判定
int is_parallel(P a1, P a2, P b1, P b2) {
  return EQ( cross(a1-a2, b1-b2), 0.0 );
}
// 点a,bを通る直線と点cの間の距離
double distance_l_p(P a, P b, P c) {
  return abs(cross(b-a, c-a)) / abs(b-a);
}
// 点a,bを端点とする線分と点cとの距離
double distance_ls_p(P a, P b, P c) {
  if ( dot(b-a, c-a) < EPS ) return abs(c-a);
  if ( dot(a-b, c-b) < EPS ) return abs(c-b);
  return abs(cross(b-a, c-a)) / abs(b-a);
}
// 点が多角形の中に存在するかどうか
bool isInPolygon(vector<P> &points,P s){
  if(points.size()==1)return false;
  vector<P> v;
  for(int i=0;i<(int)points.size();i++)v.push_back(points[i]-s);
  int sign=0;
  for(int i=1;i<=(int)v.size();i++){
    int prv=(i-1+v.size())%v.size();
    int cur=i%v.size();
    double c=cross(v[prv],v[cur]);
    if(EQ(c,0))continue;
    else if(sign==0){
      if(c>0)sign=1;
      else sign=-1;
    }
    else{
      if(sign==-1&&c>0)return false;
      else if(sign==1&&c<0)return false;
    }
  }
  return true;
}
struct Rec{
  vector<P> p;
};
// a1,a2を端点とする線分とb1,b2を端点とする線分の交差判定
int is_intersected_ls(P a1, P a2, P b1, P b2) {
  // 線分が平行な場合は重なっていないことにする
  if(abs(cross(a2-a1,b2-b1)) < EPS){
    return 0;
  }
  return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS ) &&
    ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS );
}
// aとbの矩形が接しているかどうか(どちらかがどちからを含んでいるものもふくむ
bool isTouchRectangle(Rec &a,Rec &b){
  // aの各頂点がbの中に存在しているかチェック
  for(int i=0;i<4;i++)if(isInPolygon(b.p,a.p[i]))return true;
  // 逆
  for(int i=0;i<4;i++)if(isInPolygon(a.p,b.p[i]))return true;
  // 各辺が他方のどれかの辺と接しているか
  for(int i=0;i<4;i++){
    int curi=i;
    int prvi=(i-1+4)%4;
    for(int j=0;j<4;j++){
      int curj=j;
      int prvj=(j-1+4)%4;
      if(is_intersected_ls(a.p[curi],a.p[prvi],b.p[curj],b.p[prvj]))return true;
    }
  }
  return false;
}
// a1,a2を端点とする線分とb1,b2を端点とする線分の交点計算
P intersection_ls(P a1, P a2, P b1, P b2) {
  P b = b2-b1;
  double d1 = abs(cross(b, a1-b1));
  double d2 = abs(cross(b, a2-b1));
  double t = d1 / (d1 + d2);

  return a1 + (a2-a1) * t;
}
// a1,a2を通る直線とb1,b2を通る直線の交差判定
int is_intersected_l(P a1, P a2, P b1, P b2) {
  return !EQ( cross(a1-a2, b1-b2), 0.0 );
}
// a1,a2を通る直線とb1,b2を通る直線の交点計算
P intersection_l(P a1, P a2, P b1, P b2) {
  P a = a2 - a1; P b = b2 - b1;
  return a1 + a * cross(b, b1-a1) / cross(b, a);
}
// 単位ベクトルを求める
P normalVector(P p){
  return p/abs(p);
}
// 法線ベクトルを求める
P unitVector(P a){
  return P(-a.imag(),a.real());
}
// 単位法線ベクトルを求める
P unitNormalVector(P tmp){
  P e=P(-tmp.imag(),tmp.real());
  e/=abs(e);
  return e;
}
// 座標の回転(座標pにある点を,半時計回りにa(ラジアン)回転)
P roundPoint(P p,double a){
  return P(cos(a)*p.real()-sin(a)*p.imag(),sin(a)*p.real()+cos(a)*p.imag());
}
// 多角形の面積公式
double calcPolygonArea(vector<P> p){
  double sum=0;
  for(int i = 0; i < (int)p.size(); i++)
    sum+=cross(p[i],p[(i+1)%(p.size())]);
  return abs(sum/2);
}

P ps[101];
P ps2[101];
int main(){
  int N;
  cin>>N;
  double avgx=0,avgy=0;
  for(int i=0;i<N;i++){
    double x,y;
    cin>>x>>y;
    avgx+=x;
    avgy+=y;
    ps[i]=P(x,y);
  }
  if(N%2==1){
    cout<<"NA"<<endl;
    return 0;
  }
  avgx/=N;avgy/=N;
  // for(int i=0;i<N;i++){
  //   double d1=abs(ps[(i+1)%N]-ps[i]);
  //   double d2=abs(ps[(i+N/2+1)%N]-ps[(i+N/2)%N]);
  //   // P p1=(ps[(i+1)%N]-ps[i]);
  //   // P p2=(ps[(i+N/2+1)%N]-ps[(i+N/2)%N]);
  //   //cout<<d1<<" "<<d2<<endl;
  //   //cout<<p1<<" "<<p2<<endl;
  //   //if(!EQV(p1,p2)){
  //   if(!EQ(d1,d2)){
  //     cout<<"NA"<<endl;
  //     return 0;
  //   }
  // }
  P avgp=P(avgx,avgy);
  // printf("%.10f %.10f\n",avgp.real(),avgp.imag());
  for(int i=0;i<N;i++)ps[i]-=avgp;
  for(int i=0;i<N;i++)ps2[i]=roundPoint(ps[i],PI);
  bool ok=false;
  for(int j=0;j<N;j++){
    if(EQV(ps[0],ps2[j])){
      for(int k=0;k<N;k++){
	int a=(k+j)%N;
	int b=k;
	if(!EQV(ps[a],ps2[b])){
	  cout<<"NA"<<endl;
	  return 0;
	}
      }
      ok=true;
      break;
    }
  }
  if(ok)printf("%.10f %.10f\n",avgp.real(),avgp.imag());
  else cout<<"NA"<<endl;
    
  return 0;
}

Measured memory_bytes: 1260