func_code_string: #include <bits/stdc++.h>   using namespace std;   using namespace std;   int n1, n2, m, R, B, mxn, E[10005], nxt[10005], hd[10005], to[10005],       adj[10005], cost[10005], cur[10005], dis[10005], D[10005], second, T, s, t,       tot = 0, mnc = 0;   bool vis[10005], inq[10005];   char s1[10005], s2[10005];   inline void add(int u, int v, int w, int f) {     nxt[tot] = hd[u];     hd[u] = tot;     to[tot] = v;     adj[tot] = w;     cost[tot] = f;     ++tot;     nxt[tot] = hd[v];     hd[v] = tot;     to[tot] = u;     adj[tot] = 0;     cost[tot] = -f;     ++tot;     return;   }   inline bool spfa() {     for (int i = second; i <= T; ++i) dis[i] = 0x3f3f3f3f, inq[i] = 0;     queue<int> q;     q.push(T);     dis[T] = 0;     inq[T] = 1;     while (!q.empty()) {       int u = q.front();       q.pop();       inq[u] = 0;       for (int i = hd[u]; ~i; i = nxt[i])         if (adj[i ^ 1] && dis[to[i]] > dis[u] - cost[i]) {           dis[to[i]] = dis[u] - cost[i];           if (!inq[to[i]]) q.push(to[i]), inq[to[i]] = 1;         }     }     return dis[second] < 0x3f3f3f3f;   }   inline int dfs(int u, int low) {     vis[u] = 1;     if (u == T) return low;     int sum = 0, gt;     for (int &i = cur[u]; ~i; i = nxt[i])       if (adj[i] > 0 && dis[to[i]] == dis[u] - cost[i] && !vis[to[i]]) {         gt = dfs(to[i], min(low - sum, adj[i]));         if (gt) {           adj[i] -= gt;           adj[i ^ 1] += gt;           sum += gt;           mnc += gt * cost[i];         }         if (sum == low) break;       }     return sum;   }   inline int dinic() {     int mxf = 0;     while (spfa()) {       vis[T] = 1;       while (vis[T]) {         for (int i = second; i <= T; ++i) cur[i] = hd[i], vis[i] = 0;         mxf += dfs(second, 0x3f3f3f3f);       }     }     return mxf;   }   int main() {     int u, v;     scanf( %d%d%d%d%d%s%s , &n1, &n2, &m, &R, &B, s1 + 1, s2 + 1);     memset(hd, -1, sizeof(hd));     second = 1;     s = 2;     t = 3 + n1 + n2;     T = 4 + n1 + n2;     for (int i = 1; i <= n1; ++i) {       if (s1[i] ==  R ) {         --D[s];         ++D[i + 2];         add(s, i + 2, 0x3f3f3f3f, 0);       }       if (s1[i] ==  B ) {         --D[i + 2];         ++D[t];         add(i + 2, t, 0x3f3f3f3f, 0);       }       if (s1[i] ==  U ) {         add(s, i + 2, 0x3f3f3f3f, 0), add(i + 2, t, 0x3f3f3f3f, 0);       }     }     for (int i = 1; i <= n2; ++i) {       if (s2[i] ==  R ) {         --D[i + 2 + n1];         ++D[t];         add(i + 2 + n1, t, 0x3f3f3f3f, 0);       }       if (s2[i] ==  B ) {         ++D[i + 2 + n1];         --D[s];         add(s, i + 2 + n1, 0x3f3f3f3f, 0);       }       if (s2[i] ==  U ) {         add(s, i + 2 + n1, 0x3f3f3f3f, 0), add(i + 2 + n1, t, 0x3f3f3f3f, 0);       }     }     for (int i = 1; i <= m; ++i) {       scanf( %d%d , &u, &v);       E[i] = tot;       add(u + 2, v + 2 + n1, 1, R);       add(v + 2 + n1, u + 2, 1, B);     }     for (int i = s; i <= t; ++i) {       if (D[i] < 0) add(i, T, -D[i], 0);       if (D[i] > 0) add(second, i, D[i], 0), mxn += D[i];     }     add(t, s, 0x3f3f3f3f, 0);     if (dinic() < mxn) {       puts( -1 );       return 0;     }     printf( %d n , mnc);     for (int i = 1; i <= m; ++i) {       if (!adj[E[i]])         putchar( R );       else if (!adj[E[i] + 2])         putchar( B );       else         putchar( U );     }     putchar(  n );     return 0;   }   