#include <stdio.h>#include <string.h>#include <algorithm>#include <assert.h>using namespace std;typedef long long ll;typedef pair<int,int> pii;typedef pair<pii,pii> piiii;class LPDualSolver{private:enum{LP_MIN,LP_MAX};enum{NON_NEGATIVE,NON_POSITIVE,ARBITARY,EQUAL = ARBITARY};int ParseInt(char* stream,int& pos,const unsigned int len){if(pos >= len) return -1;int num = 0;int sign = 1;if(stream[pos] == '-') { sign = -1; pos++; }else if(stream[pos] == '+') pos++;if(!(stream[pos] >= '0' && stream[pos] <= '9')) return sign;while(stream[pos] >= '0' && stream[pos] <= '9' && pos < len){num = num*10 + stream[pos]-'0';pos++;}return num * sign;}int ParsePolynomial(char* stream,int* poly,int maxSize=111){memset(poly,0,sizeof(*poly)*maxSize);int len = strlen(stream);int pos = 0;int elements = 0;while(pos != len){int coeff = ParseInt(stream,pos,len);pos++;int varid = ParseInt(stream,pos,len); varid--;if(varid < 0) break;assert(varid < maxSize);poly[varid] = coeff;elements++;}return elements;}int PrintPolynomial(int* poly,int size){bool has = false;for(int i = 0;i < size;i++){if(poly[i] == 0) continue;if(poly[i] == -1) putchar('-');else{if(has && poly[i] > 0) putchar('+');if(poly[i] != 1) printf("%d",poly[i]);}has = true;printf("y%d",i+1);}if(!has) putchar('0');return 0;}public:int n,m,direction;int objective[111];int conditions[111];int A[111][111];int restrictionType[111];int restrictionCoeff[111];LPDualSolver() { memset(this,0,sizeof(*this)); }int ReadStdin(){scanf("%d %d",&n,&m);char str[2333] = {0};scanf("%s",str);if(str[1] == 'i') direction = LP_MIN;else direction = LP_MAX;scanf("%s",str);ParsePolynomial(str,objective,n);scanf("%*s");for(int i = 0;i < n;i++){scanf("%s",str);int ZERO = 0;int varid = ParseInt(strstr(str,"x")+1,ZERO,-1)-1;if(strstr(str,"=") == NULL){conditions[varid] = ARBITARY;scanf("%*s"); }else if(strstr(str,">=")) conditions[varid] = NON_NEGATIVE;else if(strstr(str,"<=")) conditions[varid] = NON_POSITIVE;}scanf("%*s"); for(int i = 0;i < m;i++){scanf("%s",str);char* equal_sign = strstr(str,"=");*equal_sign = 0;ParsePolynomial(str,A[i],n);*equal_sign = '=';int ZERO = 0;restrictionCoeff[i] = ParseInt(strstr(str,"=")+1,ZERO,-1);if(strstr(str,">=")) restrictionType[i] = NON_NEGATIVE;else if(strstr(str,"<=")) restrictionType[i] = NON_POSITIVE;else restrictionType[i] = EQUAL;}return 0;}int ToDual(){int newA[111][111] = {0};for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){newA[j][i] = A[i][j];}}memcpy(A,newA,sizeof(newA));int tmp[111] = {0};memcpy(tmp,objective,sizeof(objective));memcpy(objective,restrictionCoeff,sizeof(restrictionCoeff));memcpy(restrictionCoeff,tmp,sizeof(tmp));memcpy(tmp,conditions,sizeof(conditions));for(int i = 0;i < m;i++){if(restrictionType[i] == EQUAL) conditions[i] = ARBITARY;else conditions[i] = restrictionType[i] ^ direction;}for(int i = 0;i < n;i++){if(tmp[i] == ARBITARY) restrictionType[i] = EQUAL;else restrictionType[i] = tmp[i] ^ direction ^ 1;}direction ^= 1;swap(n,m);return 0;}int WriteStdout(){printf("%d %dn",n,m);printf("%s ", direction ? "max" : "min");PrintPolynomial(objective,n); puts("");puts("with");for(int i = 0;i < n;i++){static const char* ***thatcannotbeanonymous[] = {">=0","<=0"," arbitary"};printf("y%d%sn",i+1,***thatcannotbeanonymous[conditions[i]]);}puts("under");for(int i = 0;i < m;i++){PrintPolynomial(A[i],n);static const char* ***thatcannotbeanonymous[] = {">=","<=","="};printf("%s%dn",***thatcannotbeanonymous[restrictionType[i]],restrictionCoeff[i]);}return 0;}};int main(void){int T = 0;scanf("%d",&T);while(T--){LPDualSolver lpds;lpds.ReadStdin();lpds.ToDual();lpds.WriteStdout();if(T) puts("");}return 0;}


