#include <bits/stdc++.h>
using namespace std;

#define dump(n) cout<<"# "<<#n<<'='<<(n)<<endl
#define repi(i,a,b) for(int i=int(a);i<int(b);i++)
#define peri(i,a,b) for(int i=int(b);i-->int(a);)
#define rep(i,n) repi(i,0,n)
#define per(i,n) peri(i,0,n)
#define all(c) begin(c),end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

const int INF=1e9;
const int MOD=1e9+7;
const double EPS=1e-9;

template<typename T1,typename T2>
ostream& operator<<(ostream& os,const pair<T1,T2>& p){
	return os<<'('<<p.first<<','<<p.second<<')';
}
template<typename T>
ostream& operator<<(ostream& os,const vector<T>& a){
	os<<'[';
	rep(i,a.size()) os<<(i?" ":"")<<a[i];
	return os<<']';
}

struct UnionFind{
	vi data;
	UnionFind(int size):data(size,-1){}
	int Find(int n){
		return data[n]<0?n:(data[n]=Find(data[n]));
	}
	void Unite(int a,int b){
		int ra=Find(a),rb=Find(b);
		if(ra!=rb){
			if(-data[ra]<-data[rb])
				swap(ra,rb);
			data[ra]+=data[rb];
			data[rb]=ra;
		}
	}
	int Size(int n){
		return -data[Find(n)];
	}
};

int main()
{
	for(int n,p1,p2;cin>>n>>p1>>p2 && n|p1|p2;){
		int m=p1+p2;
		UnionFind uf(m*2);
		rep(i,n){
			int x,y; string a; cin>>x>>y>>a; x--,y--;
			if(a=="yes"){
				uf.Unite(x,y);
				uf.Unite(m+x,m+y);
			}
			else{
				uf.Unite(x,m+y);
				uf.Unite(m+x,y);
			}
		}
		
		vvi eqs; // 同値類
		{
			vi flg(m);
			rep(i,m) if(!flg[i]){
				eqs.resize(eqs.size()+1);
				rep(j,m*2) if(uf.Find(j)==uf.Find(i)){
					eqs.back().push_back(j);
					flg[j%m]=1;
				}
			}
		}
		
		vi dcnt(eqs.size()); // 同値類に含まれるdivineの数
		rep(i,eqs.size()){
			for(int x:eqs[i])
				dcnt[i]+=x<m;
		}
		
		// dp[i+1][j]: eqs[i]までを使って，divineをj体にできるか．
		// dp[i+1][j]=  0: できない
		// dp[i+1][j]=  1: できる．eqs[i]をそのまま使う
		// dp[i+1][j]= -1: できる．eqs[i]を反転して使う
		// dp[i+1][j]=INF: できる．複数通りある(ambiguous)
		vvi dp(eqs.size()+1,vi(m+1,0));
		dp[0][0]=1;
		rep(i,eqs.size()){
			int a=dcnt[i],b=eqs[i].size()-dcnt[i];
			rep(j,m+1){
				if(dp[i][j]==INF)
					dp[i+1][j+a]=dp[i+1][j+b]=INF;
				else if(abs(dp[i][j])==1){
					if(dp[i+1][j+a]==0) dp[i+1][j+a]=1;
					else                dp[i+1][j+a]=INF;
					if(dp[i+1][j+b]==0) dp[i+1][j+b]=-1;
					else                dp[i+1][j+b]=INF;
				}
			}
		}
		
		if(abs(dp.back()[p1])!=1){
			cout<<"no"<<endl;
			continue;
		}
		
		vi ds;
		for(int i=eqs.size(),d=p1;i>0;i--){
			assert(abs(dp[i][d])==1);
			if(dp[i][d]==1){
				for(int x:eqs[i-1]) if(x<m)
					ds.push_back(x);
				d-=dcnt[i-1];
			}
			else{
				for(int x:eqs[i-1]) if(x>=m)
					ds.push_back(x-m);
				d-=eqs[i-1].size()-dcnt[i-1];
			}
		}
		sort(all(ds));
		for(int d:ds) cout<<d+1<<endl;
		cout<<"end"<<endl;
	}
}