1 /*
2 *Problem: NOI2004 曼哈顿
3 *Author : Chen Yang
4 *Time : 2012.6.8 7:10 pm
5 *State : AC
6 *Memo : 半枚举、动态规划
7 */
8 #include <cstdio>
9 #include <cstdlib>
10 #include <cstring>
11 #include <string>
12 #include <algorithm>
13 using namespace std;
14 const int maxn=111, maxl = 201, inf = 100000000;
15 int n, m, K, SM, SN[maxn], r[3], rr[3][maxn], ll[3][maxn], costm[maxn][3], costn[maxn][3];
16 int sm[maxn], sn[maxn], vm[maxn], vn[maxn], f[maxn][maxl][maxl], pp[maxn][maxl][maxl];
17 char s[maxn], tm[3], tn[3];
18 bool g[maxn][maxl][maxl];
19 struct req { int x1, x2, y1, y2; } a[maxn];
20 struct inter { int l, r; } in[3][maxl];
21
22 void init()
23 {
24 scanf("%d%d", &m, &n);
25 scanf("%s", s);
26 for (int i=1; i<=m; ++i) sm[i] = (s[i-1]=='E');
27 scanf("%s", s);
28 for (int i=1; i<=n; ++i) sn[i] = (s[i-1]=='S');
29 for (int i=1; i<=m; ++i)
30 {
31 scanf("%d", vm+i);
32 costm[i][sm[i]] = 0, costm[i][1-sm[i]] = vm[i];
33 }
34 for (int i=1; i<=n; ++i)
35 {
36 scanf("%d", vn+i);
37 costn[i][sn[i]] = 0, costn[i][1-sn[i]] = vn[i];
38 }
39 scanf("%d", &K);
40 for (int i=1; i<=K; ++i)
41 scanf("%d%d%d%d", &a[i].x1, &a[i].y1, &a[i].x2, &a[i].y2);
42 tm[0] = 'W', tm[1] = 'E', tn[0] = 'N', tn[1] = 'S';
43 }
44
45 inline bool cmp(const inter &a,const inter &b)
46 { return a.l<b.l || (a.l==b.l && a.r<b.r); }
47
48 void maintain()
49 {
50 sort(in[0]+1,in[0]+r[0]+1,cmp);
51 sort(in[1]+1,in[1]+r[1]+1,cmp);
52 for (int q=0; q<2; ++q)
53 {
54 for (int i=1; i<=n; ++i)
55 {
56 int j = 1; ll[q][i] = 1;
57 for (; j<=r[q]; ++j)
58 if (in[q][j].l>i) break;
59 else if (in[q][j].r<i) ll[q][i] = j+1;
60 rr[q][i] = j;
61 }
62 }
63 }
64
65 void add(int p, int L, int R)
66 {
67 if (L>R) swap(L,R);
68 for (int i=1; i<=r[p]; ++i)
69 if (L<=in[p][i].l && in[p][i].r<=R) return;
70 in[p][++r[p]].l = L, in[p][r[p]].r = R;
71 }
72
73 bool prepare(int s)
74 {
75 memset(rr, 0 ,sizeof rr);
76 memset(ll, 0, sizeof ll);
77 r[0] = 0, r[1] = 0;
78 for (int i=1; i<=K; ++i)
79 {
80 int x1 = a[i].x1, y1 = a[i].y1, x2 = a[i].x2, y2 = a[i].y2;
81 int p = (x1<x2), q = (y1<y2);
82 if (x1!=x2 && y1!=y2)
83 {
84 if (((s >> (x1-1)) & 1)==q && ((s >> (x2-1)) & 1)==q) add(p,y1,y2);
85 else if (((s >> (x1-1)) & 1)==q) add(p,y2,y2);
86 else if (((s >> (x2-1)) & 1)==q) add(p,y1,y1);
87 else
88 {
89 int t = 0, fr=min(x1,x2)+1, en=max(x1,x2);
90 for (int j=fr; j<en; ++j)
91 if (((s >> (j-1)) & 1)==q) t = 1;
92 if (!t) return 0;
93 add(p,y1,y1); add(p,y2,y2);
94 }
95 }
96 else if (x1==x2 && y1!=y2 && ((s >> (x1-1)) & 1) != q) return 0;
97 else if (x1!=x2 && y1==y2) add(p,y1,y2);
98 }
99 maintain();
100 return 1;
101 }
102
103 int dp()
104 {
105 memset(f, 0x7, sizeof f);
106 f[1][1][1] = 0;
107 for (int i=1; i<=n; ++i)
108 for (int j=ll[0][i]; j<=rr[0][i]; ++j)
109 for (int k=ll[1][i]; k<=rr[1][i]; ++k)
110 if (f[i][j][k]<inf)
111 {
112 if (f[i+1][rr[0][i]][k]>f[i][j][k]+costn[i][0])
113 {
114 f[i+1][rr[0][i]][k] = f[i][j][k]+costn[i][0];
115 g[i+1][rr[0][i]][k] = 0;
116 pp[i+1][rr[0][i]][k] = j;
117 }
118 if (f[i+1][j][rr[1][i]]>f[i][j][k]+costn[i][1])
119 {
120 f[i+1][j][rr[1][i]] = f[i][j][k]+costn[i][1];
121 g[i+1][j][rr[1][i]] = 1;
122 pp[i+1][j][rr[1][i]] = k;
123 }
124 }
125 return f[n+1][r[0]+1][r[1]+1];
126 }
127
128 void get_SN(int i, int j, int k)
129 {
130 if (i==1) return;
131 SN[i-1] = g[i][j][k];
132 if (!g[i][j][k]) get_SN(i-1,pp[i][j][k],k);
133 else get_SN(i-1,j,pp[i][j][k]);
134 }
135
136 void work()
137 {
138 int tot = (1<<m), ans = inf;
139 for (int i=0; i<tot; ++i)
140 {
141 int t = 0;
142 for (int j=1; j<=m; ++j) t += costm[j][(i>>(j-1))&1];
143 if (prepare(i))
144 {
145 t += dp();
146 if (t<ans)
147 {
148 ans = t, SM = i;
149 get_SN(n+1,r[0]+1,r[1]+1);
150 }
151 }
152 }
153 if (ans<inf)
154 {
155 printf("possible\n");
156 printf("%d\n", ans);
157 while (m--) printf("%c", tm[SM & 1]), SM >>= 1;
158 printf("\n");
159 for (int i=1; i<=n; ++i)printf("%c", tn[SN[i]]);
160 printf("\n");
161 } else printf("impossible\n");
162 }
163
164 int main()
165 {
166 freopen("manhattan.in", "r", stdin);
167 freopen("manhattan.out", "w", stdout);
168 init();
169 work();
170 return 0;
171 }