#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cassert>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
typedef long long ll;
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 1000000000
#define fi first
#define sc second
#define rep(i,x) for(int i=0;i<x;i++)

int main()
{
	while(1)
	{
		bool r[255][255]={};
		int num[255]={};
		int maxv,n;
		vector<int>edge[255];
		for(int i=0;i<255;i++) edge[i].clear();
		bool used[255][255]={};
		
		cin >> maxv;
		if(maxv == 0) return 0;
		cin >> n;
		for(int i=1;i<=n;i++) cin >> num[i];
		for(int i=0;i<=n;i++)
		{
			for(int j=1;j<=maxv;j++)
			{
				int d = i+j;
				if(d > n) r[i][n+1] = true;
				else
				{
					d += num[d];
					d = max(d,0);
					d = min(d,n+1);
					r[i][d] = true;
				}
			}
		}
		for(int i=0;i<=n;i++) for(int j=0;j<=n+1;j++) if(r[i][j]) edge[i].pb(j);
		for(int i=0;i<=n;i++)
		{
			//used[i][i] = true;
			queue<int>que; que.push(i);
			while(!que.empty())
			{
				int q = que.front(); que.pop();
				if(used[i][q]) continue;
				used[i][q] = true;
				for(int j=0;j<edge[q].size();j++)
				{
					if(!used[i][edge[q][j]])
					{
						que.push(edge[q][j]);
					}
				}
			}
		}
		for(int i=0;i<=n;i++)
		{
			if(used[0][i] && !used[i][n+1])
			{
				puts("NG"); goto nxt;
			}
		}
		puts("OK"); nxt:;
	}
}