const int maxn = 2e5 + 5;
const int INF = 0x3f3f3f3f;
struct node {
int num, dis;
node(int n,int d):num(n),dis(d){}
bool operator < (const node& a)const {
if (dis == a.dis)return num < a.num;
return dis < a.dis;
}
};
vector<node>g[maxn];
int dis[maxn];
int n, a, b, c;
void diskstra(int s) {
memset(dis, INF, sizeof(dis));
dis[s] = 0;
priority_queue<node>q;
q.push(node(s, dis[s]));
while (!q.empty()) {
node x = q.top(); q.pop();
for (int i = 0; i < g[x.num].size(); i++) {
node y = g[x.num][i];
if (x.dis + y.dis < dis[y.num]) {
dis[y.num] = x.dis + y.dis;
q.push(node(y.num, dis[y.num]));
}
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a >> b >> c;
g[a].push_back(node(b, c));
g[b].push_back(node(a, c));
}
diskstra(1);
for (int i = 1; i <= n; ++i)
cout << dis[i] << ' ';
cout << endl;
return 0;
}