#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mp make_pair #define pb push_back #define all(x) (x).begin(),(x).end() #define YES() printf("YES\n") #define NO() printf("NO\n") using namespace std; #define int long long //typedef long long ll; typedef unsigned long long ull; typedef vector vb; typedef vector vi; typedef vector vvb; typedef vector vvi; typedef pair P; const int INF=1e+9; const double EPS=1e-9; const int MOD=1000000007; const int dx[]={1,0,-1,0},dy[]={0,-1,0,1}; signed main(){ int h,w,k,p,ma = 0,maa = 0; int dp[34][34]; string friends[34][34] = {}; map num; map name; cin >> w >> h >> k >> p; for(int i = 0;i < k;i++){ int x,y; string s; cin >> y >> x >> s; friends[x + 1][y + 1] = s; num[s] = i; name[i] = s; } for(int i = 0;i < (1 << k);i++){ int cnt = 0; for(int j = 0;j < k;j++){ if((i >> j) & 1) cnt++; } if(cnt > p) continue; for(int j = 0;j <= h + 1;j++){ for(int l = 0;l <= w + 1;l++) dp[j][l] = 0; } dp[0][1] = 1; for(int j = 1;j <= h + 1;j++){ for(int l = 1;l <= w + 1;l++){ if(friends[j][l] == "" || (i >> (num[friends[j][l]])) & 1){ dp[j][l] = dp[j][l - 1] + dp[j - 1][l]; } } } if(ma < dp[h + 1][w + 1]){ ma = dp[h + 1][w + 1]; maa = i; } } cout << ma % MOD << endl; for(int i = 0;i < k;i++){ if((maa >> i) & 1){ cout << name[i] << endl; } } return 0; }