#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <ctime>
 
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define FFOR(i,a,b) for(int i=(a);i<=(b);i++)
#define REP(i,b) FOR(i,0,b)
#define RREP(i,b) FFOR(i,1,b)
#define PB push_back
#define F first
//#define S second
#define BE(c) c.begin(),c.end()
using namespace std;
typedef long long LL;
typedef LL ut;
typedef long double ld;
typedef pair<ut,ut> pr;
typedef vector<pr> Vpr;
typedef vector<ut> VI;
typedef pair<ut,pr> ppr;
typedef priority_queue<pr,Vpr, greater<pr> > PQ;
const int SIZE=1e+5 + 1;
const ut INF=1<<29;
const ld eps=1e-6;
const LL mod=1e+6 + 3;

class Point {
public:
	double x, y;
	
	Point(double x = 0, double y = 0) : x(x), y(y) {}
	
	Point operator + (const Point p) {
		return Point(x + p.x, y + p.y);
	}
	Point operator - (const Point p) {
		return Point(x - p.x, y - p.y);
	}
	Point operator * (const double a) {
		return Point(x * a, y * a);
	}
	Point operator / (const double a) {
		return Point(x / a, y / a);
	}
	
	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 abs() {
		return sqrt(norm());
	}
	double norm() {
		return x * x + y * y;
	}
	
};

typedef Point Vector;

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

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

// p0: ?????????
// p1, p2: ??????p0p1???p0p2??¨?????????
// ???????¨???????: 1
// ????¨???????:  -1
int ccw(Point p0, Point p1, Point p2){
	Vector a = p1 - p0;
	Vector b = p2 - p0;
	if(cross(a, b) > eps) return 1;
	if(cross(a, b) < -eps) return -1;
	if(dot(a, b) < -eps) return 2;
	if(a.norm() < b.norm()) return -2;
	
	return 0;
}

double rad = M_PI/180;

int H, R, U, M, S, du, dm, ds;
Point h[128], u[128], m[128], s[128];
int ans[128];

bool check(Point home, Point tar, double range, double w, double a){
	if(Point(tar.x - home.x, tar.y - home.y).norm() > a * a)
		return false;

	Vector d = Vector(a * cos((w - range / 2.0)*rad), a * sin((w - range / 2.0)*rad));
	Vector t = Vector(a * cos((w + range / 2.0)*rad), a * sin((w + range / 2.0)*rad));
	if(ccw(tar, tar + d, home) == 1 && ccw(tar, tar + t, home) == -1)
		return true;
	return false;
}

void query(double w, double a){
	REP(i,H){
		if(!check(h[i], Point(0, 0), du, w, a))
			continue;
		bool ok = true;
		REP(j,U){
			if(check(h[i], u[j], du, w, a)){
				ok = false;
				break;
			}
		}
		if(!ok)
			continue;
		
		REP(j,M){
			if(check(h[i], m[j], dm, w, a)){
				ok = false;
				break;
			}
		}
		if(!ok)
			continue;

		REP(j,S){
			if(check(h[i], s[j], ds, w, a)){
				ok = false;
				break;
			}
		}
		if(ok)
			ans[i]++;
	}
}

int main() {
	while(cin >> H >> R && (H || R)){
		memset(ans, 0, sizeof(ans));
		int x, y;
		REP(i,H){
			cin >> x >> y;
			h[i] = Point(x, y);
		}
		cin >> U >> M >> S >> du >> dm >> ds;
		REP(i,U){
			cin >> x >> y;
			u[i] = Point(x, y);
		}
		REP(i,M){
			cin >> x >> y;
			m[i] = Point(x, y);
		}
		REP(i,S){
			cin >> x >> y;
			s[i] = Point(x, y);
		}
	
		double w, a;
		REP(i,R){
			cin >> w >> a;
			query(w, a);
		}
		int maxim = 0;
		REP(i,H){
			maxim = max(maxim, ans[i]);
		}
		if(maxim == 0){
			cout << "NA" << endl;
			continue;
		}
		vector<int> res;
		REP(i,H){
			if(ans[i] == maxim)
				res.PB(i + 1);
		}
		REP(i,res.size()){
			if(i)
				cout << " ";
			cout << res[i];
		}
		cout << endl;
	}
 	return 0;
}

Measured memory_bytes: 1264