#include #include #include #define MAXN 30 #define scanf_1(a, b) { if (1 != scanf(a, b)) return 1; } int n; int d[MAXN][MAXN]; int sc[MAXN]; char str[MAXN + 1]; int i, j, m, mm, mm2, p, cur, opt, ans, cnt; int main() { scanf_1("%s", str); n = strlen(str); for (i = 0; i < n; ++i) { for (j = i; j < n; ++j) { scanf_1("%d", &d[i][j]); } } p = 1 << n; for (m = 1; m < p; ++m) { memset(sc, 0, sizeof(sc)); mm = m; while (mm != 0) { int mmx = mm & (mm - 1); i = __builtin_ctz(mmx ^ mm); mm2 = mm; while (mm2 != 0) { int mm2x = mm2 & (mm2 - 1); j = __builtin_ctz(mm2 ^ mm2x); sc[j] += d[i][j]; mm2 = mm2x; } mm = mmx; } mm = m; cur = 0; while (mm != 0) { int mmx = mm & (mm - 1); i = __builtin_ctz(mmx ^ mm); cur += sc[i]; mm = mmx; } if (opt < cur) { opt = cur; ans = m; } } cur = ans; cnt = 0; while (cur) { cnt += cur & 1; cur >>= 1; } printf("%d\n", cnt); for (i = 0; i < n; ++i, ans >>= 1) { if (ans & 1) { printf("%c", str[i]); } } if (opt != 0) { printf("\n"); } return 0; }