#include<bits/stdc++.h>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define EPS (1e-7)
#define COUNTER_CLOCKWISE 1
#define CLOCKWISE -1 
#define ONLINE_BACK 2
#define ONLINE_FRONT -2
#define ON_SEGMENT 0
#define equals(a,b) (fabs((a)-(b)) < EPS)

using namespace std;

const int IINF = INT_MAX;

//
class Point{
public:
  double x,y;

  Point(double x = -IINF,double y = -IINF): x(x),y(y){}

  Point operator + (Point p){return Point(x+p.x,y+p.y);}
  Point operator - (Point p){return Point(x-p.x,y-p.y);}
  Point operator * (double a){return Point(a*x,a*y);}
  Point operator / (double a){return Point(x/a,y/a);}
  Point operator * (Point a){ return Point(x * a.x - y * a.y, x * a.y + y * a.x); }

  bool operator < (const Point& p) const{ return !equals(x,p.x)?x<p.x:y<p.y; }

  bool operator == (const Point& p)const{ return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS; }

};

struct Segment{
  Point p1,p2;
  Segment(Point p1 = Point(),Point p2 = Point()):p1(p1),p2(p2){}
  bool operator == (const Segment& p)const { return p.p1 == p1 && p.p2 == p2; }
};

typedef Point Vector;
typedef Segment Line;
typedef vector<Point> Polygon;

ostream& operator << (ostream& os,const Point& a){ os << "(" << a.x << "," << a.y << ")"; }

ostream& operator << (ostream& os,const Segment& a){ os << "( " << a.p1 << " , " << a.p2 << " )"; }

double dot(Point a,Point b){ return a.x*b.x + a.y*b.y; }

double cross(Point a,Point b){ return a.x*b.y - a.y*b.x; }

double norm(Point a){ return a.x*a.x+a.y*a.y; }

double abs(Point a){ return sqrt(norm(a)); }

//rad は角度をラジアンで持たせること
Point rotate(Point a,double rad){ return Point(cos(rad)*a.x - sin(rad)*a.y,sin(rad)*a.x + cos(rad)*a.y); }

// 度をラジアンに変換
double toRad(double agl){ return agl*M_PI/180.0; }

// a => prev, b => cur, c=> next
// prev から cur へ行って next へ行く際の角度を求める
double getArg(Point a,Point b,Point c){
  double arg1 = atan2(b.y-a.y,b.x-a.x);
  double arg2 = atan2(c.y-b.y,c.x-b.x);
  double arg = fabs( arg1 - arg2 );
  while( arg > M_PI ) arg -= 2.0 * M_PI;
  return fabs(arg);
}

int ccw(Point p0,Point p1,Point p2){
  Point a = p1-p0;
  Point b = p2-p0;
  if(cross(a,b) > EPS)return COUNTER_CLOCKWISE;
  if(cross(a,b) < -EPS)return CLOCKWISE;
  if(dot(a,b) < -EPS)return ONLINE_BACK;
  if(norm(a) < norm(b))return ONLINE_FRONT;
  return ON_SEGMENT;
}

//

const int MAX_N = 110;
int N,M,Ume,Momo,SakuraHappyInnovation,counter[MAX_N],limit[3];
Point ps[MAX_N],p[3][20];
double d[3],w[110],a[110];

bool LT(double A,double B)  { return !equals(A,B) && A < B; }
bool LTE(double A,double B) { return  equals(A,B) || A < B; }

bool inside(Point h,Point t,double ta,double tw,double td){
  double rad_w = toRad(tw), rad_d = toRad(td/2.0);
  Point tmp = Point(ta*cos(rad_w),ta*sin(rad_w));
  Point alpha = rotate(tmp,-rad_d) + t;
  Point beta  = rotate(tmp,rad_d)  + t;
  int res_ccw = ccw(t,alpha,h);
  bool res1 = ( res_ccw == COUNTER_CLOCKWISE || res_ccw == ON_SEGMENT || res_ccw == ONLINE_BACK || res_ccw == ONLINE_FRONT ) ;
  res_ccw = ccw(t,beta,h);
  bool res2 = ( res_ccw == CLOCKWISE || res_ccw == ON_SEGMENT || res_ccw == ONLINE_BACK || res_ccw == ONLINE_FRONT ) ;
  double dist = abs(h-t);
  bool res3 = LTE(dist,ta);
  return res1 && res2 && res3;
}

inline void compute(){
  rep(i,N) counter[i] = 0;
  rep(_,M){
    rep(i,N){
      bool failed = false;
      if( inside(ps[i],Point(0,0),a[_],w[_],d[0]) ) {
        rep(j,3) if( !failed ) rep(k,limit[j]) failed |= inside(ps[i],p[j][k],a[_],w[_],d[j]);
      } else failed = true;
      if( !failed ) ++counter[i];
    }
  }
  int maxi = -1;
  rep(i,N) if( counter[i] != 0 ) maxi = max(maxi,counter[i]);
  if( maxi == -1 ) puts("NA");
  else {
    bool first = true;
    rep(i,N) if( counter[i] == maxi ){
      if( !first ) printf(" "); first = false;
      printf("%d",i+1);
    }
    puts("");
  }
}

int main(){

  while( scanf("%d %d",&N,&M), N|M ){
    rep(i,N) scanf("%lf %lf",&ps[i].x,&ps[i].y);
    scanf("%d %d %d %lf %lf %lf",&Ume,&Momo,&SakuraHappyInnovation,d,d+1,d+2);
    limit[0] = Ume, limit[1] = Momo, limit[2] = SakuraHappyInnovation;
    rep(i,Ume) scanf("%lf %lf",&p[0][i].x,&p[0][i].y);
    rep(i,Momo) scanf("%lf %lf",&p[1][i].x,&p[1][i].y);
    rep(i,SakuraHappyInnovation) scanf("%lf %lf",&p[2][i].x,&p[2][i].y);
    rep(i,M) scanf("%lf %lf",w+i,a+i);
    compute();
  }
  return 0;
}

Measured memory_bytes: 1248