- #include <iostream> 
- #include <vector> 
- #include <deque>   
- using namespace std; 
-   
- struct vertax{ 
- 	int vert, index, father; bool visited; 
- 	vertax(int a){vert = a; index = 10001; father = a;visited = false;} 
- 	vertax(int a, int b){ 
- 		vert = a; 
- 		father = b; 
- 		index = 10001;visited = false; 
- 	} 
- 	vertax(int a, int b, int x){ 
- 		vert = a; 
- 		father = b; 
- 		index = x;visited = false; 
- 	} 
- 	vector<vertax> follow; 
- 	~vertax(){} 
- }; 
-   
- struct graph{ 
- 	vector<vertax> v; // list of vertax 
- 	int count; 
- 	graph(){}; 
- 	graph(int n){ 
- 		count = n; 
- 	} 
- 	void get(){ 
- 		for(int i = 1; i <= count; i++){ 
- 			vertax v(i); 
- 			for(int j = 1; j <= count; j++){ 
- 				int x; 
- 				cin >> x; 
- 				if(x != 0){ 
- 					vertax temp(j, i, x); 
- 					v.follow.push_back(temp); 
- 				} 
- 			} 
- 			graph::v.push_back(v); 
- 		} 
- 	} 
- 	void write(){ 
- 		for(int i = 0; i < count; i++){ 
- 			cout << v[i].index << ":"; 
- 			for(int j = 0; j < v[i].follow.size(); j++){ 
- 				cout << v[i].follow[j].vert << " "; 
- 			} 
- 			cout << endl; 
- 		} 
- 	} 
- 	void way(vertax& x){ 
- 		deque<vertax> list; 
- 		x.index = 0; 
- 		x.visited = true; 
- 		list.push_front(x); 
- 		while(!list.empty()){ 
- 			vertax& y = list[0]; 
- 			for(int i = 0; i < y.follow.size();i++){ 
- 				v[y.follow[i].vert -1].visited = true; 
- 				if(v[y.follow[i].vert-1].index > y.index+y.follow[i].index){ 
- 					v[y.follow[i].vert-1].index = y.index+y.follow[i].index; 
- 					if(v[y.follow[i].vert-1].index > -102){ 
- 						list.push_back(v[y.follow[i].vert-1]); 
- 					} 
- 				} 
- 			} 
- 			list.pop_front(); 
- 		} 
- 	} 
- 	void def(){ 
- 		for(int i = 0; i < v.size(); i++){ 
- 			v[i].index = 10001; 
- 			v[i].visited = false; 
- 		} 
- 	} 
- 	void task1(){ 
- 		for(int i = 0; i < v.size(); i++){ 
- 			way(v[i]); 
- 			for(int j = 0; j < v.size()-1; j++){ 
- 				if(!v[j].visited){ 
- 					cout << 0 << " "; 
- 				}else if(v[j].index < -50){ 
- 					cout << 2 << " "; 
- 				}else{ 
- 					cout << 1 << " "; 
- 				} 
- 			} 
- 			if(!v[v.size()-1].visited){ 
- 					cout << 0 ; 
- 				}else if(v[v.size()-1].index < -50){ 
- 					cout << 2 ; 
- 				}else{ 
- 					cout << 1 ; 
- 				} 
- 			def(); 
- 			cout << endl; 
- 		} 
- 	} 
- 	void task2(){ 
- 		for(int i = 0; i < v.size(); i++){ 
- 			way(v[i]); 
- 			for(int j = 0; j < v.size()-1; j++){ 
- 				if(!v[j].visited){ 
- 					cout << 0 << " "; 
- 				}else{ 
- 					cout << v[j].index << " "; 
- 				} 
- 			} 
- 			if(!v[v.size()-1].visited){ 
- 					cout << 0 ; 
- 				}else{ 
- 					cout << v[v.size()-1].index; 
- 				} 
- 			def(); 
- 			cout << endl; 
- 		} 
- 	} 
- }; 
-   
-   
- int main() { 
- 	ios::sync_with_stdio(false); 
- 	int n; 
- 	cin >> n; 
- 	graph dog(n); 
- 	dog.get(); 
- 	dog.task2(); 
- 	return 0; 
- }