#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

struct Point{
	Point(double arg_x,double arg_y){
		x = arg_x;
		y = arg_y;
	}

	Point(){
		x = y = 0.0;
	}

	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); }

	double abs(){ return sqrt(norm()); }
	double norm(){ return x*x + y*y; }

	bool operator<(const Point &p) const{
		return 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;
	}

	double x,y;
};

typedef Point Vector;

int num_house,num_wind;
int UME,MOMO,SAKURA;
int ok_num[100];
double deg_UME,deg_MOMO,deg_SAKURA;
double dist_UME[100][11],dist_MOMO[100][10],dist_SAKURA[100][10];
Point info[100],info_UME[11],info_MOMO[10],info_SAKURA[10];
vector<int> ANS;

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

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

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

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

static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -1;
static const int ON_SEGMENT = 0;

int ccw(Point p0,Point p1,Point p2){

	Vector a = p1 - p0;
	Vector 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(a.norm() < b.norm())return ONLINE_FRONT;

	return ON_SEGMENT;
}

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

bool is_OK(Point tree,Point house,double value,double wind_deg,double deg){

	 Vector v1 = Vector(value*cos((wind_deg+deg/2)*M_PI/180),value*sin((wind_deg+deg/2)*M_PI/180));
	 Vector v2 = Vector(value*cos((wind_deg-deg/2)*M_PI/180),value*sin((wind_deg-deg/2)*M_PI/180));

	 if(ccw(tree,tree+v1,house) == CLOCKWISE && ccw(tree,tree+v2,house) == COUNTER_CLOCKWISE) {
		 return true;
	 }else{
		 return false;
	 }
}

void func(){

	for(int i = 0; i < num_house; i++)ok_num[i] = 0;

	for(int i = 0; i < num_house; i++){
		scanf("%lf %lf",&info[i].x,&info[i].y);
	}

	scanf("%d %d %d %lf %lf %lf",&UME,&MOMO,&SAKURA,&deg_UME,&deg_MOMO,&deg_SAKURA);

	//私の梅
	info_UME[0].x = 0;
	info_UME[0].y = 0;

	for(int i = 1; i <= UME; i++){
		scanf("%lf %lf",&info_UME[i].x,&info_UME[i].y);
	}

	for(int i = 0; i < MOMO; i++){
		scanf("%lf %lf",&info_MOMO[i].x,&info_MOMO[i].y);
	}

	for(int i = 0; i < SAKURA; i++){
		scanf("%lf %lf",&info_SAKURA[i].x,&info_SAKURA[i].y);
	}

	//あらかじめ、各木との距離を求めておく
	for(int i = 0; i < num_house; i++){

		for(int k = 0; k <= UME; k++){
			dist_UME[i][k] = calc_dist(info[i],info_UME[k]);
		}
		for(int k = 0; k < MOMO; k++){
			dist_MOMO[i][k] = calc_dist(info[i],info_MOMO[k]);
		}
		for(int k = 0; k < SAKURA; k++){
			dist_SAKURA[i][k] = calc_dist(info[i],info_SAKURA[k]);
		}
	}

	double degree,value;
	bool FLG;

	for(int loop = 0; loop < num_wind; loop++){
		scanf("%lf %lf",&degree,&value);

		//私の梅の香りだけが届く家を探す
		for(int i = 0; i < num_house; i++){
			if(value < dist_UME[i][0])continue;//私の梅から距離が遠ければSKIP

			if(!is_OK(info_UME[0],info[i],value,degree,deg_UME))continue; //私の梅から香りが届かなければSKIP

			FLG = true;

			//他の香りが届かないか調べる
			for(int k = 1; k <= UME; k++){
				if(value >= dist_UME[i][k] && is_OK(info_UME[k],info[i],value,degree,deg_UME) == true){
					FLG = false;
					break;
				}
			}
			if(!FLG)continue;

			for(int k = 0; k < MOMO; k++){
				if(value >= dist_MOMO[i][k] && is_OK(info_MOMO[k],info[i],value,degree,deg_MOMO) == true){
					FLG = false;
					break;
				}
			}
			if(!FLG)continue;

			for(int k = 0; k < SAKURA; k++){
				if(value >= dist_SAKURA[i][k] && is_OK(info_SAKURA[k],info[i],value,degree,deg_SAKURA) == true){
					FLG = false;
					break;
				}
			}
			if(!FLG)continue;

			ok_num[i]++;
		}
	}

	int maximum = 0;
	ANS.clear();

	for(int i = 0; i < num_house; i++){
		if(ok_num[i] > maximum){
			maximum = ok_num[i];
			ANS.clear();
			ANS.push_back(i+1);
		}else if(ok_num[i] > 0 && ok_num[i] == maximum){
			ANS.push_back(i+1);
		}
	}

	if(ANS.size() == 0){
		printf("NA\n");
	}else{

		printf("%d",ANS[0]);
		for(int i = 1; i < ANS.size(); i++){
			printf(" %d",ANS[i]);
		}
		printf("\n");
	}
}

int main(){

	while(true){
		scanf("%d %d",&num_house,&num_wind);
		if(num_house == 0 && num_wind == 0)break;

		func();
	}

	return 0;
}



Measured memory_bytes: 3600