#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <numeric>
#include <cmath>
#include <climits>
#include <limits>
#include <cfloat>
#include <fstream>
using namespace std;

void disp_t (vector <vector <int> > t )
{
	int size = t.size();
	int len  = t[0].size();
	int i,j;

	for (i = 1; i < size; ++i){
		for (j = 1; j < len; ++j){
			cout << setw(2) << t[i][j];
		} // end for
		cout << endl;
	} // end for
}
	

bool check_table (vector <vector <int> > t )
{
	int size = t.size();
	int len  = t[0].size();
	int i,j;

	for (i = 1; i < size; ++i){
		for (j = 1; j < len; ++j){
			if (t[i][j] == 0 ){
				continue;
			}else{
				return false;
			} // end if
		} // end for
	} // end for

	return true;
}

bool dfs (int s, int e, vector <vector<int> > & t )
{

	if (s == e ){
		if (check_table (t ) ){
			return true;
		}else{
			return false;
		} // end if
	} // end if

	int size = t.size();
	int i;

	for (i = 0; i < size; ++i ){
		if (t[s][i] > 0){
//			cout << s << " --> " << i << endl;
//			disp_t (t );
			--t[s][i];
			--t[i][s];
			if (dfs (i, e, t ) ){
				return true;
			} // end if
			++t[s][i];
			++t[i][s];
		} // end if
	} // end for

	return false;
}
			
	

bool search (int s, int e, vector <vector <int> > T )
{
	vector <vector <int> >& t = T;
	
	if (dfs (s, e, t ) ){
		return true;
	} // end if

	return false;
}


int main()
{
//	cut here before submit 
//	freopen("testcase.patrol", "r", stdin);
	string str = "";
	multimap <int, int> p;
	int max_n = 0;

	while (getline (cin, str ) ){
		int a, b;
		stringstream ss(str);
		ss >> a >> b;
		max_n = max (max_n, a );
		max_n = max (max_n, b );
		if (a != 0 || b != 0 ){
			p.insert (make_pair (a, b ) );
			continue;
		} // end if
		
		vector <vector <int> > T (max_n + 1, vector <int> (max_n + 1, 0 ) );
		multimap<int, int>::iterator it = p.begin();
		for (; it != p.end(); ++it){
			++T[(*it).first][(*it).second];
			++T[(*it).second][(*it).first];
		} // end for
		int i;
		int start = 1;
		int end = 2;

//		disp_t (T );

		if (search (start, end, T ) ){
			cout << "OK" << endl;
		}else{
			cout << "NG" << endl;
		} // end if 		

		max_n = 0;
		p.clear();
	} // end loop
		
	return 0;
}