1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <bits/stdc++.h>

#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())

using namespace std;

ostream *ferr;

#ifdef LOCAL
template<typename A, typename B>
auto&operator<<(auto&o,pair<A, B>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<&","[!i++]<<e;return o<<"}";}
#define debug(X...)(*ferr)<<"["#X"]: ",[](auto...$){(((*ferr)<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif

using i64 = long long;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<i64, i64>;
using vi = vector<int>;
using vll = vector<i64>;

const int INF = 1e9;
const int WEIGHT_BITS = 9;
const int MAX_WEIGHT = 510;
const int VERTEX_BITS = 11;

void SendInt(i64 val, int nbits) {
	for (int i = 0; i < nbits; ++i) {
		cout << "+ " << ((val >> i) & 1) << "\n";
	}
	cout << flush;
}

i64 ReadInt(int nbits) {
	i64 ans = 0;
	for (int i = 0; i < nbits; ++i) {
		cout << "?" << endl;
		i64 bit;
		cin >> bit;
		ans |= (bit << i);
	}
	return ans;
}

int main() {
	ios_base::sync_with_stdio(0);
	// cin.tie(0);
	cout << fixed << setprecision(14);
	cerr << fixed << setprecision(6);

	string agent;
	cin >> agent;
	const bool is_bajtek = (agent == "Bajtek");

	#ifdef LOCAL
	ferr = new ofstream(is_bajtek ? "b.err" : "a.err");
	#else
	ferr = &cerr;
	#endif

	int n, m;
	cin >> n >> m;

	vector<vector<pii>> graph(n + 1);
	for (int i = 0; i < m; ++i) {
		int u, v, c;
		cin >> u >> v >> c;
		graph[u].emplace_back(v, c);
		graph[v].emplace_back(u, c);
		assert(0 <= c && c < (1 << WEIGHT_BITS));
	}

	vector<int> dist(n + 1, INF);
	vector<bool> visited(n + 1);
	dist[1] = 0;
	int last_dist = 0;

	priority_queue<pii> Q;

	auto VisitVertex = [&](int vtx) {
		debug(is_bajtek, vtx, dist[vtx]);
		visited[vtx] = true;
		last_dist = dist[vtx];
		for (auto [s, c] : graph[vtx]) {
			const int new_dist = dist[vtx] + c;
			if (new_dist < dist[s]) {
				dist[s] = new_dist;
				Q.emplace(pii{-dist[s], s});
			}
		}
	};

	VisitVertex(1);
	for (int time_step = 0; time_step < n - 1; ++time_step) {
		while (!Q.empty() && visited[Q.top().second]) {
			Q.pop();
		}
		const int my_best_dist = Q.empty() ? (last_dist + MAX_WEIGHT) : (-Q.top().first);
		assert(my_best_dist >= last_dist);
		const int my_delta = my_best_dist - last_dist;
		SendInt(my_delta, WEIGHT_BITS);
		const int friend_delta = ReadInt(WEIGHT_BITS);

		const bool do_i_win = (my_delta < friend_delta) || (my_delta == friend_delta && is_bajtek);
		debug(is_bajtek, my_delta, friend_delta);
		if (do_i_win) {
			const int vtx = Q.top().second;
			SendInt(vtx, VERTEX_BITS);
			VisitVertex(vtx);
		} else {
			const int vtx = ReadInt(VERTEX_BITS);
			const int friend_best_dist = last_dist + friend_delta;
			dist[vtx] = friend_best_dist;
			VisitVertex(vtx);
		}
	}

	if (!is_bajtek) {
		cout << "!";
		for (int vtx = 1; vtx <= n; ++vtx) {
			cout << " " << dist[vtx];
		}
		cout << endl;
	}
}