#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<math.h>
using namespace std;
#define N 55
int n,k;
struct node
{
int x,y,r;
};
node dao[15];
vector<node> q[15];
int map[N][N],vis[N][N];
int fabs(int x)
{
return x>0?x:-x;
}
int dist(int w,int i,int j)
{
if(fabs(i-dao[w].x)+fabs(j-dao[w].y)<=dao[w].r) return 1;
return 0;
}
void init()
{
int i,j,w;
node u;
for(w=0; w<k; w++)
{
q[w].clear();
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(map[i][j]) continue;
u.x=i;
u.y=j;
if(dist(w,i,j))
q[w].push_back(u);
}
}
}
}
int main()
{
int i,j;
while(scanf("%d",&n)&&n)
{
scanf("%d",&k);
memset(map,0,sizeof(map));
for(i=0; i<k; i++)
{
scanf("%d%d",&dao[i].x,&dao[i].y);
map[dao[i].x][dao[i].y]=1;
}
for(i=0; i<k; i++) scanf("%d",&dao[i].r);
init();
int c,w=1<<k,s,f,num,d;
int res=10000;
for(i=0;i<w;i++)
{
memset(vis,0,sizeof(vis));
num=0;
for(j=0;j<k;j++)
{
d=1<<j;
if(d&i)
{
num++;
for(s=0;s<q[j].size();s++)
vis[q[j][s].x][q[j][s].y]=1;
}
}
f=0;
for(j=1;j<=n;j++)
{
for(s=1;s<=n;s++)
{
if(map[j][s]) continue;
if(!vis[j][s]) { f=1; break; }
}
if(f) break;
}
if(!f) res=min(num,res);
}
if(res>1000) puts("-1");
else printf("%d\n",res);
}
return 0;
}